c – 使用UTC来回转换日期是否安全,以便忽略DST但仍然使用当前用
我有一个日期(没有时间,假设时间00:00:00)我在time_t和struct tm之间转换.
我以简单的YYYYMMDD格式获取日期并将其转换为struct tm: struct tm my_tm; memset(&my_tm,sizeof(my_tm)); my_tm.tm_year = str.mid(0,4).toInt() - 1900; my_tm.tm_mon = str.mid(4,2).toInt() - 1; my_tm.tm_mday = str.mid(6,2).toInt(); > P.S.:对于那些想知道我有QString(Qt)的人,因此使用了mid()和toInt()成员. 然后我使用mktime()将该日期转换为time_t: time_t my_time(mktime(&my_tm)); 如果日期是2016年3月6日(“20160306”在结构tm中变为2016/03/05),那么日期变为前一天(更确切地说,-1h).这是因为DST(相应地设置了tm_isdst). 我有另一个版本的mktime(),名为 time_t my_time(mkgmtime(&my_tm)); 然后我可以使用gmtime_r()函数将日期转换回struct tm.这样,我再次获得相同的日期: struct tm other_tm; gmtime_r(&my_time,&other_tm); 但是,在某些时候,我希望以最终用户的语言环境定义的标准格式显示日期.为此,我使用ICU库.在下面,我在调用format_date()之前强制f_current_timezone变量为UTC,然后日期出现在2016年3月6日(如果我保留用户时区,我可能会改为2016年3月5日.) QString locale::format_date(time_t d) { QUnicodeString const timezone_id(f_current_timezone); LocalPointer<TimeZone> tz(TimeZone::createTimeZone(timezone_id)); Locale const l(f_current_locale.toUtf8().data()); LocalPointer<DateFormat> dt(DateFormat::createDateInstance(DateFormat::kDefault,l)); dt->setTimeZone(*tz); UDate const udate(d * 1000LL); QUnicodeString u; dt->format(udate,u); return u; } 使用“UTC”作为时区从format_date()获取正确的结果是否安全(对你有意义吗?) 解决方法
在使用mktime()之前,将tm_hour设置为12(12pm).如果你关心的是使用应用程序的locate来格式化日期部分,那么使用mktime()的正午就足够了.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |