【发布时间】:2011-06-08 14:46:33
【问题描述】:
我有一个我写的函数(如果有好的标准替代品,请告诉我...)
time_t get_unix_time(string time_str) {
time_t loctime;
time(&loctime);
struct tm *given_time;
time_str = time_str.substr(0, time_str.find_first_of('.'));
replace(time_str.begin(), time_str.end(), ':', ',');
replace(time_str.begin(), time_str.end(), '-', ',');
replace(time_str.begin(), time_str.end(), '/', ',');
replace(time_str.begin(), time_str.end(), ' ', ',');
given_time = localtime(&loctime);
vector<string> trecord = split_string(time_str, ',');
given_time->tm_year = atoi(trecord.at(0).c_str()) - 1900;
given_time->tm_mon = atoi(trecord.at(1).c_str()) - 1;
given_time->tm_mday = atoi(trecord.at(2).c_str());
given_time->tm_hour = atoi(trecord.at(3).c_str());
given_time->tm_min = atoi(trecord.at(4).c_str());
given_time->tm_sec = atoi(trecord.at(5).c_str());
return mktime(given_time);
}
函数的输入 (time_str) 格式为 1970-01-01 00:00:00.0。 split_string() 函数将字符串time_str 拆分成一个向量,其中包含:
{ 1970, 01, 01, 00, 00, 00 }
用于填充given_time结构。
我写了一个函数来测试它,并准确地传递了那个输入(纪元的开始)。但是,它返回给我的时间是 21600,即 1970-01-01 06:00:00,或 UTC+6。预期的输出是 0(纪元的开始)。
注意:我在美国中部时区,即 UTC - 6。在 1970 年 1 月 1 日午夜,@UTC 时间将是 1970 年 1 月 1 日 06:00:00。
我的函数中是否有任何内容使其特定于我的时区?我在这个函数中做错了什么,或者我可以做一些不同的事情来使它独立于区域,或者至少总是 UTC。
【问题讨论】:
-
另外,我不能使用 boost 库或任何其他附加库。我只能使用标准的 C++ 东西。
-
C++ 库中的时区处理非常晦涩难懂。如果您启动程序时将环境变量
TZ设置为值UTC,则此代码 sn-p 将起作用。 -
mktime 将给定时间解释为本地时间。所以如果你给 1970-01-01 00:00:00 它将是你的本地时间,所以 mktime 将返回 UTC-0 时间,即 1970-01-01 06:00:00
标签: c++ c unix-timestamp gmt mktime