我有一个在time_t
和struct tm
之间转换的日期(没有时间,假设时间为00:00:00)。
我得到一个简单的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();
QString
(Qt)的人,因此使用了mid()
和toInt()
成员。 然后,我使用
time_t
将日期转换为mktime()
:time_t my_time(mktime(&my_tm));
如果该日期是2016年3月6日,则该日期将更改为前一天(更确切地说是-1h)(
struct tm
中的“20160306”变为2016/03/05)。这是由于DST(相应地设置了tm_isdst)。我有另一个版本的
mktime()
称为 mkgmtime()
,它可以按预期工作:由于该函数忽略了DST,因此我得到了相同的日期:time_t my_time(mkgmtime(&my_tm));
然后,我可以使用
struct tm
函数将日期转换回gmtime_r()
。这样,我又得到了相同的日期:struct tm other_tm;
gmtime_r(&my_time, &other_tm);
但是,有时我想以最终用户的区域设置所定义的标准格式显示日期。为此,我使用了ICU库。在下面的代码中,我在调用
f_current_timezone
之前将format_date()
变量强制为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点)。如果您关心的只是使用应用程序的位置格式化日期部分,那么就将ont用作mktime()
就足够了。