这些时区转换是否正确?

时间:2017-01-17 14:08:29

标签: qt timezone qdatetime

我在Windows上使用Qt 5.7.1,64位版本。 在我的应用程序中,我使用不同的时区管理一些日期时间。

我最近看到了一些奇怪的行为,这是一个简单的代码来测试它:

QDateTime ParisDate(QDate(2016, 1, 20), QTime(2, 0, 0), QTimeZone("Europe/Paris"));
QDateTime PerthDate(QDate(2016, 1, 20), QTime(9, 0, 0), QTimeZone("Australia/Perth"));
QDateTime ParisConvertedToPerth = ParisDate.toTimeZone(QTimeZone("Australia/Perth"));

qDebug() << "                                ParisDate = " << ParisDate;
qDebug() << "                                PerthDate = " << PerthDate;
qDebug() << "                     delta Paris => Perth = " << ParisDate.secsTo(PerthDate) / 3600;
qDebug() << "     delta ParisConvertedToPerth => Perth = " << ParisConvertedToPerth.secsTo(PerthDate) / 3600;
qDebug() << "                         ParisDate to UTC = " << ParisDate.toUTC();
qDebug() << "                         PerthDate to UTC = " << PerthDate.toUTC();
qDebug() << "             ParisConvertedToPerth to UTC = " << ParisConvertedToPerth.toUTC();

这产生以下输出:

                            ParisDate =  QDateTime(2016-01-20 02:00:00.000 Paris, Madrid Qt::TimeSpec(TimeZone) Europe/Paris)
                            PerthDate =  QDateTime(2016-01-20 09:00:00.000 Australie (Ouest) Qt::TimeSpec(TimeZone) Australia/Perth)
                delta  Paris => Perth =  8
delta  ParisConvertedToPerth => Perth =  0
                     ParisDate to UTC =  QDateTime(2016-01-20 01:00:00.000 UTC Qt::TimeSpec(UTC))
                     PerthDate to UTC =  QDateTime(2016-01-20 09:00:00.000 UTC Qt::TimeSpec(UTC))
         ParisConvertedToPerth to UTC =  QDateTime(2016-01-20 09:00:00.000 UTC Qt::TimeSpec(UTC))

我不明白,因为我认为2个变量&#34; ParisDate&#34;和&#34; PerthDate&#34;应该指的是同一个时间点,用不同的时区来表示。

所以我相信&#34; delta Paris =&gt;珀斯&#34;应该是0小时。

我无法相信Qt5代码坏了,所以我在这里错过了什么?

2 个答案:

答案 0 :(得分:3)

这是Qt中已修复的错误,但该修补程序未发布。看来你必须等Qt 5.9或Qt 5.6.3。

使用Qt dev分支我有这个输出:

                            ParisDate =  QDateTime(2016-01-20 02:00:00.000 Paris, Madrid Qt::TimeSpec(TimeZone) Europe/Paris)
                            PerthDate =  QDateTime(2016-01-20 09:00:00.000 Australie (Ouest) Qt::TimeSpec(TimeZone) Australia/Perth)
                 delta Paris => Perth =  0
 delta ParisConvertedToPerth => Perth =  0
                     ParisDate to UTC =  QDateTime(2016-01-20 01:00:00.000 UTC Qt::TimeSpec(UTC))
                     PerthDate to UTC =  QDateTime(2016-01-20 01:00:00.000 UTC Qt::TimeSpec(UTC))
         ParisConvertedToPerth to UTC =  QDateTime(2016-01-20 01:00:00.000 UTC Qt::TimeSpec(UTC))

答案 1 :(得分:1)

我无法谈论Qt发生的事情。但是我认为更改测试语法以使用此free, open-source C++11/14 library是一项有趣的练习,并比较测试语法和输出。

protected void Page_Load(object sender, EventArgs e)
{
    Label Lefthowmanylabel =(Label)DataList1.FindControl("Lefthowmanylabel");
    Label quantitylabel = (Label)DataList1.FindControl("quantitylabel");


    if (int.Parse(quantitylabel.Text) < 11)
    {
        Lefthowmanylabel.Visible = true;
    }
    else
    {
        Lefthowmanylabel.Visible = false;
    }


}

这产生了以下输出:

<asp:Label ID="Lefthowmanylabel" runat="server"  Text="Only 10 Left!! While stock last!" Visible="False"/>
<asp:Label ID="quantitylabel" runat="server" Text='<%# Eval("Quantity") %>' Visible="False" />
                </td>