[更新] 我正在尝试找到将 UTC 时间戳转换为不同时区的正确方法。
确切的问题:我的程序中有时间戳,它总是存储在 UTC 中,所以很好。但是,我必须能够根据用户偏好在不同的时区显示它们(实际上将它们写入文件)。
我正在使用 linux,但我想编写与 pateform 无关的代码。我不想使用 boost 库(我们已经在使用 Qt,它没有提供与 boost 日期一样多的功能)。我想编写线程安全代码我想识别像美国/东部这样的时区以简化配置(这是由用户完成的,我不太相信他们会正确使用 EST、CET、CEST 等缩写...)。
我已经在 Internet 上查看并发现了一些或多或少的工作代码,但是
- 大多数时候它使用TZ环境变量,据说这是一种非线程安全的方法。
- 它使用时区的缩写(如 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 LOC: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”