Linux 的 localtime(),gmtime() 与时区

#include<iostream>
#include <iomanip>
#include <vector>
#include <algorithm>
#include <typeinfo>

struct tm_zone
{
    int tm_sec;                /* Seconds.         [0-60] (1 leap second) */
    int tm_min;                /* Minutes.         [0-59]                 */
    int tm_hour;               /* Hours.         [0-23]                 */
    int tm_mday;             /* Day.             [1-31]                 */
    int tm_mon;               /* Month.         [0-11]                 */
    int tm_year;               /* Year    - 1900.                         */
    int tm_wday;              /* Day of week.     [0-6]                  */
    int tm_yday;               /* Days in year. [0-365]                */
    int tm_isdst;               /* DST.             [-1/0/1]               */
    const char *tzone;     /* Timezone.                            */

};

std::vector<std::string> tzone = {
    "IDLW", "NT", "CAT", "AHST", "YST", "HDT",         
    "YDT", "PST", "PDT", "MST", "MDT", "CST", 
    "EST", "CDT", "EDT", "AST", "NST", "NFT", 
    "ADT", "NDT", "WAT", "WET", "GMT", "WETDST",
    "SWT", "SET", "NOR", "MEZ", "MEWT", "MET", 
    "FST", "DNT", "CET", "BST", "SST", "METDST", 
    "MEST", "IST", "FWT", "EET", "CETDST", "EETDST",
    "BT", "IT", "JT",  "CCT", "WST", "AWST", 
    "MT", "KST", "JST", "WDT", "AWSST", "SAST", 
    "SAT", "CAST", "LIGT", "GST", "SADT", "CADT", 
    "ACSST", "AESST", "NZT", "NZST", "IDLE", "NZDT",

};

std::vector<std::vector<std::string> > time_zone = {
    {"IDLW", "-12"}, {"NT", "-11"}, {"CAT", "-10"}, {"AHST", "-10"}, {"YST", "-9"}, {"HDT", "-9"}, 
    {"YDT", "-8"}, {"PST", "-8"}, {"PDT", "-7"}, {"MST", "-7"}, {"MDT", "-6"}, {"CST", "-6"}, 
    {"EST", "-5"}, {"CDT", "-5"}, {"EDT", "-4"}, {"AST", "-4"}, {"NST", "-3.3"}, {"NFT", "-3.3"},
    {"ADT", "-3"}, {"NDT", "-2.3"}, {"WAT", "-1"}, {"WET", "0"}, {"GMT", "0"}, {"WETDST", "1"}, 
    {"SWT", "1"} , {"SET", "1"}, {"NOR", "1"}, {"MEZ", "1"}, {"MEWT", "1"},{"MET", "1"}, 
    {"FST", "1"}, {"DNT", "1"}, {"CET", "1"}, {"BST", "1"}, {"SST", "2"}, {"METDST", "2"}, 
    {"MEST", "2"}, {"IST", "2"}, {"FWT", "2"}, {"EET", "2"}, {"CETDST", "2"}, {"EETDST", "3"}, 
    {"BT", "3"}, {"IT", "3.3"}, {"JT", "7.3"}, {"CCT", "8"}, {"WST", "8"}, {"AWST", "8"}, 
    {"MT", "8.3"}, {"KST", "9"}, {"JST", "9"}, {"WDT", "9"}, {"AWSST", "9"}, {"SAST", "9.3"}, 
    {"SAT", "9.3"}, {"CAST", "9.3"}, {"LIGT", "10"}, {"GST", "10"}, {"SADT", "10.3"}, {"CADT", "10.3"}, 
    {"ACSST", "10.3"}, {"AESST", "11"}, {"NZT", "12"}, {"NZST", "11"}, {"IDLE", "12"}, {"NZDT", "13"},

};

/*

*参数tz表示传入的时区

*返回值为所传入时区当前对应的时间

*/

struct tm_zone *zonetime(const time_t *timer, const char *tz)
{
    struct tm *pt;
    pt = (struct tm *)malloc(sizeof(struct tm));
    struct tm_zone *pt_z;
    pt_z = (struct tm_zone *)malloc(sizeof(struct tm_zone));    //malloc函数在初始化结构体的内存时,如果结构体中有string类型的成员,就会报错

    //std::vector<std::string>::iterator index;  
    auto index = std::find(tzone.begin(), tzone.end(), tz);    //使用迭代器find位置时,用auto类型或者迭代器类型,不能用int
    int pos = index - tzone.begin();
    time_t rawtime = *timer + (long)(stof(time_zone[pos].at(1)) * 3600);
    pt = gmtime(&rawtime);

    pt_z->tm_sec = pt->tm_sec;
    pt_z->tm_min = pt->tm_min;
    pt_z->tm_hour = pt->tm_hour;
    pt_z->tm_mday = pt->tm_mday;
    pt_z->tm_mon = pt->tm_mon;
    pt_z->tm_year = pt->tm_year;
    pt_z->tm_wday = pt->tm_wday;
    pt_z->tm_yday = pt->tm_yday;
    pt_z->tm_isdst = pt->tm_isdst;
    pt_z->tzone = tz;

    return pt_z;
}


int main()
{
    char str_time[80];
    time_t rawtime;
    struct tm *ptime;

    ptime = (struct tm *)malloc(sizeof(struct tm));
    struct tm_zone *ptime_z;
    ptime_z = (struct tm_zone *)malloc(sizeof(struct tm_zone));

    rawtime = time(NULL);

    ptime = localtime(&rawtime);
    strftime(str_time, 80, "%Y-%m-%d %H:%M:%S", ptime);
    std::cout << "time: " << str_time << std::endl;

    ptime = gmtime(&rawtime);
    strftime(str_time, 80, "%Y-%m-%d %H:%M:%S", ptime);
    std::cout << "time: " << str_time << std::endl;

    ptime_z = time_z(&rawtime, "IDLW");
    std::cout << ptime_z->tm_year +1900 << "-" << ptime_z->tm_mon + 1 << "-" << ptime_z->tm_mday << " ";
    std::cout << ptime_z->tm_hour << ":" << ptime_z->tm_min << ":" << ptime_z->tm_sec << " " << ptime_z->tzone <<std::endl;

    return 0;
}

运行结果:

注解:

1. time_t :  typedef long time_t

2. struct tm

{

  int tm_sec;                     /* Seconds.   [0-60] (1 leap second) */

  int tm_min;                    /* Minutes.   [0-59] */

  int tm_hour;                   /* Hours.      [0-23] */

  int tm_mday;                 /* Day.          [1-31] */

  int tm_mon;                   /* Month.      [0-11] */

  int tm_year;                   /* Year   - 1900.  */

  int tm_wday;                 /* Day of week.      [0-6] */

  int tm_yday;                  /* Days in year.     [0-365]  */

  int tm_isdst;                   /* DST. 夏令时         [-1/0/1]*/

# ifdef    __USE_MISC

  long int tm_gmtoff;              /* Seconds east of UTC.  */

  const char *tm_zone;           /* Timezone abbreviation.  */

# else

  long int __tm_gmtoff;          /* Seconds east of UTC.  */

  const char *__tm_zone;       /* Timezone abbreviation.  */

# endif

};

3.  time()函数原型:time_t time(time_t *__timer)

                  返回值:格林尼治时间1970年1月1日00:00:00到当前时刻的时长,时长单位是秒;

4.  localtime()函数原型:tm *localtime(const time_t *__timer)

                          返回值:把从1970-1-1零点零分到当前时间系统所偏移的秒数时间转换为本地时间并以结构体的形式返回该时间;

5.  gmtime()函数原型:tm *gmtime(const time_t *__timer)

                       返回值:没有经过时区变换的时间,是协调世界时(UTC),比格林尼治标准时间(GMT)更准确,UTC与GMT之间误差不超过0.9秒。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

humengfei94

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值