Qt ISODate格式化的日期/时间,包括时区
Qt ISODate formatted date/time including timezone
有谁知道一种更简洁的方法来获取QDateTime的ISO字符串表示中包含的时区?
我应该能够只使用以下:
qDebug() << QDateTime::currentDateTime().toString(Qt::ISODate);
但这总是以 UTC 格式出现:
2014-02-24T01:29:00Z
目前,我解决这个问题的方法是通过显式设置偏移量来强制TimeSpec为Qt::offsetFromUtc,这是我最初从QDateTime获得的。
QDateTime now = QDateTime::currentDateTime();
int offset = now.offsetFromUtc();
now.setOffsetFromUtc(offset);
qDebug() << now.toString(Qt::ISODate);
这给出了最初预期的内容:
2014-02-24T01:29:00+02:00
有谁知道如何以更干净的方式执行此操作,或者必须将其记录为错误?
编辑:我正在使用Qt5.2.1
更新:
下面的小程序说明了我的意思:
#include <QtCore/QDateTime>
#include <QtCore/QDebug>
int main(int argc, int argv){
qDebug() << QDateTime::currentDateTime().toString(Qt::ISODate);
qDebug() << QDateTime::currentDateTime().toTimeSpec(Qt::OffsetFromUTC).toString(Qt::ISODate);
QDateTime now = QDateTime::currentDateTime();
int offset = now.offsetFromUtc();
now.setOffsetFromUtc(offset);
qDebug() << now.toString(Qt::ISODate);
return 0;
}
将生成以下输出:
"2014-02-24T10:20:49"
"2014-02-24T08:20:49Z"
"2014-02-24T10:20:49+02:00"
最后一行是预期的行。请注意,第二次已转换为UTC,这不是想要的。
当我需要时,我使用以下解决方法:
QDateTime::currentDateTime().toOffsetFromUtc(QDateTime::currentDateTime().offsetFromUtc()).toString(Qt::ISODate);
我还没有测试@lpappa是否正在开发新版本。上述解决方法已在Qt 5.3<</p>
这在 5.2 之前不存在,但它被集成到其中。似乎您的语法不正确,因为它应该是这样的:
QDateTime::currentDateTime().toTimeSpec(Qt::OffsetFromUTC).toString(Qt::ISODate)
根据相应的错误报告。请注意,toTimeSpec(Qt::OffsetFromUTC) 在中间调用。
这
似乎有效,具有毫秒级的准确性并保留时区信息:
#include <QDebug>
#include <QTimeZone>
QString datetimeToIsoMs(const QDateTime& dt)
{
// An ISO-8601 format preserving millisecond accuracy and timezone.
// Equivalent in moment.js: thing.format("YYYY-MM-DDTHH:mm:ss.SSSZ")
// Example: '2016-06-02T10:04:03.588+01:00'
// Here we also allow 'Z' for UTC.
// In Qt, BEWARE:
// dt; // QDateTime(2016-06-02 10:28:06.708 BST Qt::TimeSpec(LocalTime))
// dt.toString(Qt::ISODate); // "2016-06-02T10:28:06" -- DROPS timezone
QString localtime = dt.toString("yyyy-MM-ddTHH:mm:ss.zzz");
int offsetFromUtcSec = dt.offsetFromUtc();
// FOR TESTING: offsetFromUtcSec = -(3600 * 2.5);
QString tzinfo;
if (offsetFromUtcSec == 0) {
tzinfo = "Z";
} else {
QString sign = offsetFromUtcSec < 0 ? "-" : "+";
offsetFromUtcSec = abs(offsetFromUtcSec);
int hours = offsetFromUtcSec / 3600;
int minutes = (offsetFromUtcSec % 3600) / 60;
tzinfo += QString("%1%2:%3").arg(sign)
.arg(hours, 2, 10, QChar('0'))
.arg(minutes, 2, 10, QChar('0'));
// http://stackoverflow.com/questions/2618414/convert-an-int-to-a-qstring-with-zero-padding-leading-zeroes
}
return localtime + tzinfo;
}
QString datetimeToIsoMsUtc(const QDateTime& dt)
{
QDateTime utc_dt = dt.toTimeSpec(Qt::UTC);
return datetimeToIsoMs(utc_dt);
}
QDateTime isoToDateTime(const QString& iso)
{
return QDateTime::fromString(iso, Qt::ISODate);
}
相关文章:
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 具有未知值时的时间复杂性
- 时间复杂度 当具有复合数据类型(如元组或对)时?
- 获取 QInputEvent 在 Qt 4.8 中被放入 QEventLoop 队列时的时间戳
- 如何在 android ndk 上链接 C 和 C++ 代码,以及 C 和 C++ 运行时库(包括 STL)?
- 为什么在尝试测量函数返回所需的时间时,我的运行时编号是错误的?
- 标头,包括在 Swift 项目中使用C++文件时的错误
- 比较向量中的元素时所花费的时间呈指数级增长
- 交叉编译时包括外部库
- 在确定函数的时间复杂度时需要帮助
- OpenCV 函数 cv::remap() 的执行时间更长,当程序在两者之间进入睡眠状态时
- 为什么 std::chrono 在测量循环和编译器优化的并行 OpenMP 的执行时间时不起作用?
- 在NDK中启用链接时间优化时,链接器错误
- 触发编译时间错误时,constexpr函数的超载被调用
- 当没有时间源时,安卓源代码的哪一部分决定了最初的安卓时间
- C++11打印当前系统时间(包括毫秒)
- 在c++中修改时间程序时出现逻辑错误
- 当' sleep_until() '指定过去的时间点时,其行为定义良好
- 如何使函数在不同时间调用时返回不同的字符串?C++
- Java 套接字数据仅在发送时间延迟时有效