我有一个 CSV 文件,其日期格式为“2021/04/25 12:47:54 pm GMT+8”,存储在字符串中。我目前使用以下代码在 C++ Builder 11 中转换日期字段,没有任何问题。
TFormatSettings FSG;
TDateTime CsvDate;
FSG.DateSeparator = '/';
FSG.ShortDateFormat = "yyyy/mm/dd";
FSG.LongTimeFormat = "h:nn:ss";
FSG.TimeSeparator = ':';
CsvDate = StrToDateTime(GoogleValue, FSG);
然而,c++ Builder 12 似乎已经改变了一些东西,现在时间没有转换,当调用 StrToDateTime 时我得到一个异常。有人可以告诉我发生了什么变化,以便我可以再次使用它。
例外是:
First chance exception at $766698B2. Exception class EConvertError with message
''2024/01/17 10:40:45 pm GMT+8' is not a valid date and time'.
Process MyApp.exe (26032)
我尝试添加
TFormatSettings FSG = TFormatSettings::Create("en-AU");
和
TFormatSettings FSG = TFormatSettings::Create();
这些都无助于消除异常。
v11 及更早版本不关心输入字符串中是否存在 GMT 偏移量,当
AM/PM
到达尾随子字符串时,它们将停止解析,无论其后面的任何内容如何。在 v12 中,实现了新的逻辑,如果输入字符串的时间部分 1) 在旧的 v11 逻辑下解析失败,或者 2) 解析成功但时间后面有任何非空白字符,
'-'
则'+'
时间部分将使用FSG.ShortTimeFormat
您未提供的 -进行解析,这就是该函数现在失败的原因。即使您确实提供了
ShortTimeFormat
,新的解析逻辑仍然可能会失败,因为它根本不支持 GMT 偏移量。话虽这么说,如果您的所有输入都以
GMT+8
特定结尾,那么您可以在 中指定ShortTimeFormat
,例如:否则,如果您仅从偏移量中删除
GMT
前缀,这也将起作用并且会被忽略:否则,您将必须手动
GMT+...
从输入字符串中删除整个子字符串:如果您需要结果
TDateTime
包含 GMT 偏移量,那么您必须自己解析偏移量并进行TDateTime
相应调整。我已向 Embarcadero 提交了有关此破坏性逻辑更改的错误报告:
RSS-1014:[Try]StrToDateTime() 失败,字符串在早期版本中工作正常