gpt4 book ai didi

c++ - 将 UTC time_t 转换为不同的时区 C++ 线程安全

转载 作者:太空宇宙 更新时间:2023-11-04 12:09:38 26 4
gpt4 key购买 nike

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

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

我在 linux 上工作,但我想编写与格式无关的代码。我不想使用 boost 库(我们已经在使用 Qt,它不提供与 boost 一样多的日期功能)。我想写线程安全的代码我想确定像美国/东部这样的时区以简化配置(这是由用户完成的,我不太相信他们会正确使用缩写,如 EST、CET、CEST...)。

我已经在 Internet 上查找并找到了一些或多或少的工作代码,但是

  • 大部分时间它使用 TZ env 变量,据说这是一种非线程安全的方法。
  • 它使用时区的缩写(如 EST、CET...)。

谁能告诉我一个好的方法?

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

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

它处理日光变化请参见下面的示例(巴黎的日光变化发生在 2012 年 3 月 25 日 01H00 UTC(从本地时间 02H00 到本地时间 03H00)。这是将时间戳从 UTC 转换为巴黎(有夏令时)和 Kuala_Lumpur(没有夏令时)的示例。

#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");
}

输出(第一个:时间变化前一秒,第二个:时间变化后一秒)。

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

自定义 TS UTC:03:25:2012 01:00:00

自定义 TS KL:“03:25:2012 09:00:00”

自定义 TS 巴黎:“03:25:2012 03:00:00”


自定义 TS LOC:03:25:2012 03:00:00

自定义 TS UTC:03:25:2012 03:00:00

自定义 TS KL:“03:25:2012 11:00:00”

自定义 TS 巴黎:“03:25:2012 05:00:00”

最佳答案

根据 this thread ,使用 QDateTime 可以执行 dateTime.addSecs(3600*timeZoneOffset); 其中 dateTime 是 QDateTime。

根据 gmtime reference ,C 库中没有内置时区支持,但您可以通过向 tm->tm_hour 添加需要的偏移量来“有点”模拟它们。顺便说一下,这不会正确调整日期(与 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com