[更新]
我试图找到正确的方法来将UTC中的时间戳转换为不同的时区。
确切的问题:我的程序中有时间戳,它总是存储在UTC中,所以很好。但是,我必须能够根据用户的喜好在不同的时区中显示它们(实际上将它们写入文件)。
我正在linux上工作,但我想编写独立于pateform的代码。
我不想使用增强库(我们已经在使用Qt,它没有提供与增强日期有关的功能)。
我想写线程安全的代码
我想确定像美国/东部这样的时区以简化配置(这是由用户完成的,我不太有信心他们会正确使用EST,CET,CEST等缩写)。
我已经在Internet上查看了,发现或多或少的有效代码,但是
有人能告诉我一个好方法吗?
这就是我现在所拥有的(几天前在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/