[更新]
我试图找到正确的方法来将UTC中的时间戳转换为不同的时区。

确切的问题:我的程序中有时间戳,它总是存储在UTC中,所以很好。但是,我必须能够根据用户的喜好在不同的时区中显示它们(实际上将它们写入文件)。

我正在linux上工作,但我想编写独立于pateform的代码。
我不想使用增强库(我们已经在使用Qt,它没有提供与增强日期有关的功能)。
我想写线程安全的代码
我想确定像美国/东部这样的时区以简化配置(这是由用户完成的,我不太有信心他们会正确使用EST,CET,CEST等缩写)。

我已经在Internet上查看了,发现或多或少的有效代码,但是

  • 在大多数情况下都使用 TZ env变量,该变量被称为不是线程安全的方法。
  • 它使用时区的缩写(例如EST,CET ...)。

  • 有人能告诉我一个好方法吗?

    这就是我现在所拥有的(几天前在Internet上找到并在本示例中修改为使用我的Qt库)。
    此代码可能不是线程安全的。

    新版本:
    仍然不是线程安全的,但它或多或少地完成了这项工作。
    可能不容易移植到窗口环境中。

    处理日光变化
    请参阅下面的示例(巴黎的夏令时发生在2012年3月25日世界标准时间01H00(从当地时间02H00在当地时间03H00传递)。
    这是将时间戳记从UTC转换为巴黎(有夏令时)和瓜拉_鲁普尔(没有夏令时)的示例。

    #include <QtCore/QCoreApplication>
    #include <QDateTime>
    #include <stdio.h>
    #include <stdlib.h>
    #include <QDebug>
    
    void treatTimestamp(QString timestamp,QString format);
    
    int main(int argc, char *argv[])
    {
        QString format = "MM:dd:yyyy hh:mm:ss";
        treatTimestamp("03:25:2012 00:59:59",format);
        qDebug()<<"---------------------";
        treatTimestamp("03:25:2012 01:00:00",format);
        return 0;
    }
    
    void treatTimestamp(QString timestamp_s,QString format)
    {
        unsetenv("TZ");
        setenv("TZ", "UTC", 1);
        QDateTime timestamp = QDateTime::fromString(timestamp_s, format);
        qDebug()<<"CUSTOM TS UTC:"<<timestamp.toUTC().toString(format).toStdString().c_str();;
        time_t tmp = timestamp.toUTC().toTime_t();
        setenv("TZ", ":Asia/Kuala_Lumpur", 1);
        qDebug()<<"CUSTOM TS KL:"<<QDateTime::fromTime_t(tmp).toString(format);
        setenv("TZ", "Europe/Paris", 1);
        qDebug()<<"CUSTOM TS Paris:"<<QDateTime::fromTime_t(tmp).toString(format);
        unsetenv("TZ");
    }
    

    输出(第一:时间更改之前一秒钟,第二:之后时间更改一秒)。

    自定义位置:03:25:2012 01:00:00

    自定义时间UTC:03:25:2012 01:00:00

    CUSTOM TS KL:“03:25:2012 09:00:00”

    CUSTOM TS Paris:“03:25:2012 03:00:00”

    自定义位置:03:25:2012 03:00:00

    自定义时间UTC:03:25:2012 03:00:00

    CUSTOM TS KL:“03:25:2012 11:00:00”

    CUSTOM TS Paris:“03:25:2012 05:00:00”

    最佳答案

    根据this thread,使用QDateTime可以在dateTime为QDateTime的情况下进行dateTime.addSecs(3600*timeZoneOffset);

    根据gmtime reference的说法,C库中没有内置时区支持,但是您可以通过向tm->tm_hour添加require offset来“kinda”模拟它们。顺便说一句,它不能正确调整日期(与QDateTime方法不同)。

    根据mktime参考,mktime将“标准化”日期时间值,因此您可以将时间偏移量添加到tm_hour,调用mktime。但是,未指定mktime如何调整struct tm的文件-如果您说将tm_hour设置为27,将tm_hour限制为23还是将tm_hour设置为3,从而增加tm_day(可能是月/年)?

    如果我是你,我只会使用QDateTime::addSecs方法。

    关于c++ - 将UTC time_t转换为不同的时区C++线程安全,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10381138/

    10-11 22:46
    查看更多