加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 使用UTC来回转换日期是否安全,以便忽略DST但仍然使用当前用

发布时间:2020-12-16 06:51:39 所属栏目:百科 来源:网络整理
导读:我有一个日期(没有时间,假设时间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)
我有一个日期(没有时间,假设时间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()的正午就足够了.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读