C++ Builder 12中StrToDateTime转换带时区日期抛异常,11版本正常求助
问题原因
C++ Builder 12 对StrToDateTime的输入格式校验做了更严格的处理。在C++ Builder 11中,StrToDateTime会自动忽略字符串末尾不匹配格式定义的后缀(比如GMT+8),但12版本开始要求输入字符串必须完全匹配你在TFormatSettings中定义的格式规则,否则就会抛出EConvertError异常。你的格式设置里未包含时区部分的定义,因此无法解析带GMT+8的字符串。
修复方案
有两种可靠的修复方式,可根据需求选择:
方案1:移除字符串中的时区后缀
直接从输入字符串中截取日期时间部分,去掉末尾的 GMT+8后再转换,这是最简单直接的方式:
String GoogleValue = "2024/01/17 10:40:45 pm GMT+8"; // 截取到时区前缀" GMT"之前的内容 String DateTimePart = GoogleValue.SubString(1, GoogleValue.Pos(" GMT") - 1); TFormatSettings FSG; FSG.DateSeparator = '/'; FSG.ShortDateFormat = "yyyy/mm/dd"; FSG.LongTimeFormat = "h:nn:ss am/pm"; // 补充am/pm的格式匹配 FSG.TimeSeparator = ':'; TDateTime CsvDate = StrToDateTime(DateTimePart, FSG);
方案2:修改TFormatSettings以支持时区格式
如果需要让解析规则兼容带时区的字符串,可以在LongTimeFormat中加入时区的匹配规则:
String GoogleValue = "2024/01/17 10:40:45 pm GMT+8"; TFormatSettings FSG; FSG.DateSeparator = '/'; FSG.ShortDateFormat = "yyyy/mm/dd"; FSG.LongTimeFormat = "h:nn:ss am/pm 'GMT'z"; // 加入固定字面量"GMT"及时区偏移占位符z FSG.TimeSeparator = ':'; TDateTime CsvDate = StrToDateTime(GoogleValue, FSG);
注意:
'GMT'是单引号包裹的字面量,用于匹配字符串中的固定文本;z是时区偏移占位符,用于匹配+8这类时区标识。
补充说明
你之前尝试的TFormatSettings::Create()或Create("en-AU")方式,因为默认格式规则里同样不包含GMT+8的匹配逻辑,所以依然会失败。必须手动调整ShortDateFormat和LongTimeFormat,让其完全匹配输入字符串的结构。
内容的提问来源于stack exchange,提问作者Barry Andrews
相关产品推荐
相关产品推荐

