c – 使用UTC来回转换日期是否安全,以便忽略DST但仍然使用当前用户的有效区域设置?

c – 使用UTC来回转换日期是否安全,以便忽略DST但仍然使用当前用户的有效区域设置?,第1张

概述我有一个日期(没有时间,假设时间00:00:00)我在time_t和struct tm之间转换. 我以简单的YYYYMMDD格式获取日期并将其转换为struct tm: struct tm my_tm;memset(&my_tm, 0, sizeof(my_tm));my_tm.tm_year = str.mid(0, 4).toInt() - 1900;my_tm.tm_mon = str 我有一个日期(没有时间,假设时间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(),名为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但仍然使用当前用户的有效区域设置?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1224806.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存