Qt -> QLocale::toDateTime() 奇怪的错误,仅在尝试转换“任何一年的九月的第一个星期日”时失败

问题描述 投票:0回答:2

这非常非常奇怪。

使用

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

转换效果很好,除了...每年 9 月的第一个星期日! Image: Failing dates

(编辑:在这里给出一个代码片段,你如何测试结果是否有效)

我测试了什么:

a) 输入文件是干净的,只有 UTF8 字符,没有流氓字符

b) 在 2 台不同的 PC 上测试

c) 更改操作系统区域设置(编辑:你更改了哪些?)

d) 将输入日期分隔符从“-”更改为“/”

特别提示:

e) 如果我去掉时间部分“0:00:00”,它工作正常。 再一次,为什么在 46 年中唯一失败的日期是 9 月的第 46 个星期日?

我正在尝试将以 CSV 格式列出的日期转换为正确的日期时间。 从 15.706 个文件中,只有 46 个失败... 都是九月的第一个星期天!

qt pyqt qt5
2个回答
1
投票

我会在这里引导夏洛克福尔摩斯,并会说你在智利工作或者你正在使用他们的 TZ。

如果您阅读文档:

如果字符串可以被解析并表示无效的日期时间(例如 在时区转换跳过的间隙中),无效的 QDateTime 是 返回,其 toMSecsSinceEpoch() 表示附近的日期时间 这是有效的。

附言。您正在混合使用 ISO 格式 (

Qt::ISODate
) 和 Qt 文本格式。对于 ISO,它是
DD
YYYY
,对于 Qt,它是
dd
yyyy
。 Qt 在某种程度上纠正了这一点,但这可能会引发边缘情况。

通过排除,我们得到唯一可能的情况:无效的时间间隔。在智利,时钟更改为 9 月第一个星期六的 24:00,下星期日的 0:00 不存在。

尝试检查生成的纪元时间以更正此错误。主要是一个 24:00 :00 的表示法问题。


0
投票
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/

© www.soinside.com 2019 - 2024. All rights reserved.