这非常非常奇怪。
使用
QLocale::toDateTime()
转换CSV格式的Datetime,会出现这样的情况:
我有 15.707 个日期,从
1/jan/1990
到 31/dec/2032
,使用格式字符串 dd-MM-YYYY h:mm:ss
.
例子:
{....}
15-12-2032 0:00:00
16-12-2032 0:00:00
17-12-2032 0:00:00
18-12-2032 0:00:00
19-12-2032 0:00:00
{....}
31-12-2032 0:00:00
(编辑:在这里给出一个代码片段,你如何测试结果是否有效)
我测试了什么:
a) 输入文件是干净的,只有 UTF8 字符,没有流氓字符
b) 在 2 台不同的 PC 上测试
c) 更改操作系统区域设置(编辑:你更改了哪些?)
d) 将输入日期分隔符从“-”更改为“/”
特别提示:
e) 如果我去掉时间部分“0:00:00”,它工作正常。 再一次,为什么在 46 年中唯一失败的日期是 9 月的第 46 个星期日?
我正在尝试将以 CSV 格式列出的日期转换为正确的日期时间。 从 15.706 个文件中,只有 46 个失败... 都是九月的第一个星期天!
我会在这里引导夏洛克福尔摩斯,并会说你在智利工作或者你正在使用他们的 TZ。
如果您阅读文档:
如果字符串可以被解析并表示无效的日期时间(例如 在时区转换跳过的间隙中),无效的 QDateTime 是 返回,其 toMSecsSinceEpoch() 表示附近的日期时间 这是有效的。
Qt::ISODate
) 和 Qt 文本格式。对于 ISO,它是 DD
和 YYYY
,对于 Qt,它是 dd
和 yyyy
。 Qt 在某种程度上纠正了这一点,但这可能会引发边缘情况。
通过排除,我们得到唯一可能的情况:无效的时间间隔。在智利,时钟更改为 9 月第一个星期六的 24:00,下星期日的 0:00 不存在。
尝试检查生成的纪元时间以更正此错误。主要是一个 24:00 :00 的表示法问题。
QLocale::setDefault( QLocale( QLocale::Spanish, QLocale::Chile ) );
QLocale().toDateTime( "03-09-2023 0:00:00", "dd-MM-yyyy H:mm:ss" );
在某些机器上返回有效的日期时间,而在其他机器上则不返回。所以看来一定有一些本地机器,与 Qt 语言环境不同,被
QLocale().toDateTime()
使用。另见:https://forum.qt.io/topic/144308/qlocale-todatetime-issue/