使用时区和夏令时的字符串转换为Qt QDateTime

3

我正在将时间从字符串中插入。

QDateTime time =QDateTime::fromString("Wed Mar 26 22:37:40 2019 GMT-08");
qDebug()<<time.toLocalTime().toString();
qDebug()<<time.toUTC().toString();
qDebug()<<time.isDaylightTime();

我得到的输出结果为

  • "Tue Mar 26 23:37:40 2019"
  • "Wed Mar 27 06:37:40 2019 GMT"
  • false

应该是

  • "Tue Mar 26 23:37:40 2019"
  • "Wed Mar 27 05:37:40 2019 GMT"
  • true

如何在时间戳字符串中传递夏令时?

2个回答

3
如果你查看官方文档,它会说:
如果 Qt::TimeSpec 不是 Qt::LocalTime 或 Qt::TimeZone,则将始终返回 false。
因此首先,检查 QDateTime::timeSpec 是否返回您期望的内容。
如果您事先知道格式,请尝试使用等效函数 QDateTime::fromString 指定要解析的字符串的格式。
将两者结合起来,您可以这样做:
const char* s = "2009-11-05T03:54:00";
QDateTime d = QDateTime::fromString(s, Qt::ISODate).toLocalTime();
d.setTimeSpec(Qt::LocalTime); // Just to ensure that the time spec are the proper one, i think is not needed
qDebug() << d.isDaylightTime();

3

首先,从“Wed Mar 26 22:37:40 2019 GMT-08”计算得出的UTC时间“Wed Mar 27 06:37:40 2019 GMT”是正确的,但它怎么可能是5:37呢?

为什么GMT或UTC不包括夏令时的解释:

无论是UTC还是GMT都不会因为夏令时而改变。然而,一些使用GMT的国家在夏令时期间会切换到不同的时区。例如,在2019年的夏季(夏令时期间,从3月10日到11月3日),AKDT(阿拉斯加夏令时)是GMT-8时区之一。在冬季,使用GMT-9的AKST(阿拉斯加标准时间)。

其次,正如其他答案中已经指出的那样,如果Qt::TimeSpec不是Qt::LocalTime或Qt::TimeZone,则QDateTime::isDaylightTime返回false。

当您使用QDateTime::fromString 与时区信息一起使用,就像您的代码示例中一样,timespec将正确设置为Qt::OffsetFromUTC。 您可以实例化另一个QDateTime对象,使其具有Qt::LocalTime或Qt::TimeZone作为TimeSpec。 您可以例如使用QDateTime :: toLocalTime将其转换为本地时间,或使用QDateTime :: fromSecsSinceEpoch将其转换为Qt :: LocalTime或Qt :: TimeZone,该函数接受偏移秒用于时区。

请参见下面的示例代码。 我位于芬兰,在那里夏令时从3月31日开始,因此您可以看到在使用标准时间和夏令时时的本地时间差异:

QDateTime time = QDateTime::fromString("Wed Mar 26 22:37:40 2019 GMT-08");

qDebug()<<"\nLocal time EET:";
QDateTime localTime = time.toLocalTime();
// This works too, here to local time:
//QDateTime localTime = QDateTime::fromSecsSinceEpoch(time.toSecsSinceEpoch());
qDebug()<<localTime.timeSpec();
qDebug()<<localTime.timeZone();
qDebug()<<localTime.timeZoneAbbreviation();
qDebug()<<localTime.toLocalTime().toString();
qDebug()<<localTime.toUTC().toString();
qDebug()<<localTime.isDaylightTime();

time = QDateTime::fromString("Wed Apr 26 22:37:40 2019 GMT-08");

qDebug()<<"\nLocal time EEST:";
localTime = time.toLocalTime();
qDebug()<<localTime.timeSpec();
qDebug()<<localTime.timeZone();
qDebug()<<localTime.timeZoneAbbreviation();
qDebug()<<localTime.toLocalTime().toString();
qDebug()<<localTime.toUTC().toString();
qDebug()<<localTime.isDaylightTime();

输出:

Local time EET:
Qt::LocalTime
QTimeZone("Europe/Helsinki")
"EET"
"Wed Mar 27 08:37:40 2019"
"Wed Mar 27 06:37:40 2019 GMT"
false

Local time EEST:
Qt::LocalTime
QTimeZone("Europe/Helsinki")
"EEST"
"Sat Apr 27 09:37:40 2019"
"Sat Apr 27 06:37:40 2019 GMT"
true

"2019年3月26日22:37:40 GMT-08,包括夏令时。我也在谷歌上检查过,它显示的是5:37。" - Awais Rafique
1
我更新了我的回答,并解释了GMT不包括夏令时的原因。我以目前处于GMT-8的阿拉斯加州为例。希望这能澄清问题。 - talamaki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接