gpt4 book ai didi

c++ - 使用 UTC 来回转换日期以忽略 DST 但仍对当前用户使用有效的语言环境是否安全?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:21:58 27 4
gpt4 key购买 nike

我有一个日期(没有时间,假设时间为 00:00:00),我在 time_tstruct 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.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”在 struct 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(中午 12 点)。如果您所关心的只是使用应用程序的定位来格式化日期部分,那么对于 mktime() 使用 noon 就足够了。

关于c++ - 使用 UTC 来回转换日期以忽略 DST 但仍对当前用户使用有效的语言环境是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36380575/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com