Eu tenho um arquivo CSV com datas no formato "2021/04/25 12:47:54 pm GMT+8" que são armazenadas em uma String. Atualmente converto o campo de data no C++ Builder 11 com o código a seguir sem problemas.
TFormatSettings FSG;
TDateTime CsvDate;
FSG.DateSeparator = '/';
FSG.ShortDateFormat = "yyyy/mm/dd";
FSG.LongTimeFormat = "h:nn:ss";
FSG.TimeSeparator = ':';
CsvDate = StrToDateTime(GoogleValue, FSG);
No entanto, o c++ Builder 12 parece ter mudado alguma coisa e agora o tempo não converte, recebo uma exceção quando StrToDateTime é chamado. Alguém pode me dizer o que mudou para que eu possa fazer isso funcionar novamente.
EXCEÇÃO é:
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)
Eu tentei adicionar
TFormatSettings FSG = TFormatSettings::Create("en-AU");
e
TFormatSettings FSG = TFormatSettings::Create();
Nenhum deles ajudou a remover a exceção.
v11 e anteriores não se importavam se um deslocamento GMT estivesse presente na string de entrada, eles parariam de analisar quando a
AM/PM
substring final fosse alcançada, independentemente de qualquer coisa que a seguisse.Na v12, há uma nova lógica implementada que se a parte do tempo da string de entrada 1) falhar na análise sob a lógica antiga da v11 ou 2) analisar com êxito, mas qualquer caractere que não seja espaço em branco diferente
'-'
ou'+'
após o tempo, então o tempo parte será analisada usandoFSG.ShortTimeFormat
- o que você não está fornecendo, e é por isso que a função está falhando agora.Mesmo que você tenha fornecido um
ShortTimeFormat
, a nova lógica de análise ainda poderá falhar porque simplesmente não suporta deslocamentos GMT.Dito isto, se TODAS as suas entradas terminarem com
GMT+8
especificamente, você poderá especificar isso noShortTimeFormat
, por exemplo:Caso contrário, se você retirar apenas o
GMT
prefixo do deslocamento, isso também funcionará e será ignorado:Caso contrário, você terá que retirar manualmente toda a
GMT+...
substring da string de entrada:Se você precisar que o resultado
TDateTime
inclua o deslocamento GMT, você mesmo terá que analisar o deslocamento e ajustá-loTDateTime
de acordo.Eu registrei um relatório de bug com a Embarcadero sobre essa mudança lógica significativa:
RSS-1014: [Try]StrToDateTime() falha com string que funcionava bem em versões anteriores