【问题标题】:Qt QDateTime from string with timezone and daylight saving来自带有时区和夏令时的字符串的 Qt QDateTime
【发布时间】:2019-08-17 15:13:30
【问题描述】:

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

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

我得到的输出

  • “2019 年 3 月 26 日星期二 23:37:40”
  • “格林威治标准时间 2019 年 3 月 27 日星期三 06:37:40”

应该给的

  • “2019 年 3 月 26 日星期二 23:37:40”
  • “格林威治标准时间 2019 年 3 月 27 日星期三 05:37:40”
  • 是的

如何通过时间戳字符串传递夏令时?

【问题讨论】:

    标签: c++ qt timezone dst


    【解决方案1】:

    如果您查看官方文档,它会说:

    如果 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();
    

    【讨论】:

      【解决方案2】:

      首先,从“2019 年 3 月 26 日星期三 22:37:40 2019 GMT-08”计算得出的 UTC 时间“2019 年 3 月 27 日星期三 06:37:40 GMT”绝对正确。你觉得怎么可能是 5 点 37 分?

      解释为什么 GMT 或 UTC 不包括 DST:

      UTC 和 GMT 都不会改变夏令时 (DST)。 但是,一些使用 GMT 的国家/地区会切换到不同的时间 夏令时期间的区域。例如,AKDT(阿拉斯加日光 时间)是夏令时(夏令时)的 GMT-8 时区之一 节省时间)在 2019 年 3 月 10 日至 11 月 3 日之间。 冬季,正在使用 AKST(阿拉斯加标准时间),即 GMT-9。

      第二,正如在其他回答时间QDateTime::isDaylightTime always returns false if the Qt::TimeSpec is not Qt::LocalTime or Qt::TimeZone 中已经指出的那样。

      当您使用QDateTime::fromString 代码示例中的时区信息时,时间规范正确设置为Qt::OffsetFromUTC。您可以将另一个 QDateTime 对象实例化为同一时间,但 TimeSpec 为 Qt::LocalTime 或 Qt::TimeZone。你可以例如使用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
      • 我更新了我的答案,解释了 GMT 不包括夏令时。我以目前处于 GMT-8 的阿拉斯加为例。希望它澄清。
      猜你喜欢
      • 1970-01-01
      • 2019-01-05
      • 2013-10-13
      • 2012-03-21
      • 2015-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-07
      相关资源
      最近更新 更多