#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秒。