我有一个在time_tstruct 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();
  • P.S .:对于那些想知道我有一个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()就足够了。

    09-30 15:04
    查看更多