做新专辑排序的需求时,需要对专辑的时间进行排序,由于目前该字段是字符串类型的日期,在排序函数中要转成标准的UNIX时间戳来进行对比,大概代码如下:
struct tm tm1;
strptime(string("2018-01-18").c_str(), "%Y-%m-%d", &tm1);
time_t t1 = mktime(&tm1);
std::cout << t1 << endl;
struct tm tm2;
strptime(string("2011-11-11").c_str(), "%Y-%m-%d", &tm2);
time_t t2 = mktime(&tm2);
std::cout << t2 << endl;
std::cout << "result:" << ((t1 > t2) ? "true" : "false") << endl;
一个很简单的字符串转时间戳进行比较的逻辑,但是运行后发现,mktime()
返回的时间戳很随机,明显有异常。
3175021632//错误的时间戳
1320966000
result:true
...
2765263112//错误的时间戳
1320966000
result:true
查看mktime()
的API:
Notes If the std::tm object was obtained from std::get_time or the POSIX strptime, the value of tm_isdst is indeterminate, and needs to be set explicitly before calling mktime.
这里有提到说如果是从strptime()
取到的值,tm_isdst
的值是不确定的,必须手动指定。因此想到,是否对于未做初始化的struct tm
,strptime()
函数并不会去给每个值赋值。查看strptime
It is unspecified whether multiple calls to strptime() using the same tm structure will update the current contents of the structure or overwrite all contents of the structure. Conforming applications should make a single call to strptime() with a format and all data needed to completely specify the date and time being converted.
因此,解决方法就是在使用strptime()
之前,对结构体进行零初始化(zero-initialize)
struct tm tm1 = {0};
...
struct tm tm2 = {0};
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。