我以简单的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(),名为mkgmtime()
,它按预期工作:由于该函数忽略了DST,我得到相同的日期:
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()的正午就足够了. 总结以上是内存溢出为你收集整理的c – 使用UTC来回转换日期是否安全,以便忽略DST但仍然使用当前用户的有效区域设置?全部内容,希望文章能够帮你解决c – 使用UTC来回转换日期是否安全,以便忽略DST但仍然使用当前用户的有效区域设置?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)