Как преобразовать строку в дату в delphi

Две разные копии для проверки того же проекта

В моем случае проблема заключалась в невозможности дифференциации Eclipse между двумя разными копиями одного и того же проекта. У меня есть одна блокировка на багажнике (контроль версий SVN), а другой - в одной ветви за раз. Я опробовал одно изменение в рабочей копии как тестовый пример JUnit, который включал в себя извлечение частного внутреннего класса для самостоятельного публичного класса, и пока он работал, я открываю другую копию проекта, чтобы посмотреть вокруг на другой часть кода, которая нуждается в изменениях. В какой-то момент NoClassDefFoundError появился, жалуясь, что частного внутреннего класса не было; двойной щелчок в трассировке стека привел меня к исходному файлу с неправильной копией проекта.

Закрытие внешней копии проекта и запуск тестового примера снова избавилось от проблемы.

3
задан Tom Brunberg 13 July 2018 в 09:01
поделиться

3 ответа

Успех преобразования из string в TDateTime с использованием VarToDateTime зависит от настроек локали в системе пользователей. Преобразование не выполняется, если эти параметры не соответствуют строке. Это причина, по которой преобразование завершается с ошибкой в ​​моей системе, а также на вашем.


Основной параметр, если вы работаете с Delphi XE6 или новее, заключается в использовании функции ISO8601ToDate(), как предложено Marc Guillot в другом ответе

Если вы работаете с Delphi 2010 или более поздней версией, вы можете использовать представленное здесь решение.

Более ранние версии, чем дроссель Delphi 2010 на «T» во входной строке и может преуспеть, если «T» удаляется или заменяется пробелом.


Используйте функцию преобразования, которая принимает параметр TFormatSetting, который можно отрегулировать в соответствии со строкой для преобразования. Эта функция представляет собой следующую перегрузку StrToDateTime() (см. документ Embarcadero )

function StrToDateTime(const S: string; const AFormatSettings: TFormatSettings): TDateTime;

Установка AFormatSettings в соответствии с строкой для преобразования гарантирует, что преобразование будет успешным:

procedure TForm3.Button1Click(Sender: TObject);
var
  fs: TFormatSettings;
  s: string;
  dt: TDateTime;
begin
  fs := TFormatSettings.Create;
  fs.DateSeparator := '-';
  fs.ShortDateFormat := 'yyyy-MM-dd';
  fs.TimeSeparator := ':';
  fs.ShortTimeFormat := 'hh:mm';
  fs.LongTimeFormat := 'hh:mm:ss';

  s := '2018-07-11T13:45:14.363';
  dt := StrToDateTime(s, fs);
end;
9
ответ дан Tom Brunberg 17 August 2018 в 13:39
поделиться
  • 1
    Не было бы лучше использовать специальную конвертацию ISO8601? – David Heffernan 13 July 2018 в 10:45

Попробуйте функцию StrToDateTime , которая преобразует значение даты string DateTime в значение TDateTime. Обратите внимание, что формат даты и времени должен быть текущим системным форматом даты / времени, иначе он выдает исключение. Пример: StrToDateTime('2018-07-11 12:34:56');

-3
ответ дан Fabrizio 17 August 2018 в 13:39
поделиться
  • 1
    StrToDateTime('2018-07-11 12:34:56') приводит к возникновению исключения. Кроме того, строка в вопросе имеет другой формат. -1 – David Heffernan 13 July 2018 в 10:44

Кажется, это строки ISO-времени ISO8601: https://en.wikipedia.org/wiki/ISO_8601#Combined_date_and_time_representations

Итак, на Delphi XE 6 и позже вы можете использовать соответствующая функция преобразования: ISO8601ToDate

http://docwiki.embarcadero.com/Libraries/XE8/en/System.DateUtils.ISO8601ToDate

Но если вы используете более старую версию Delphi, тогда вы можете использовать функцию XMLTimeToDateTime в модуле XSBuiltIns для этого преобразования (доступного с Delphi 6).

http://docwiki.embarcadero.com/ Библиотеки / Токио / о / Soap.XSBuiltIns.XMLTimeToDateTime

5
ответ дан Marc Guillot 17 August 2018 в 13:39
поделиться
  • 1
    Хороший вывод +1, вы можете добавить небольшую деталь: ... функция на Delphi XE6 и более поздняя: ISO ... Функция была добавлена ​​в XE6 и правильно документирована в документах XE8. – Tom Brunberg 13 July 2018 в 10:28
  • 2
    @TomBrunberg, вы правы. Готово. – Marc Guillot 13 July 2018 в 12:20
  • 3
    Но Marc, он доступен только из Delphi XE6 – Tom Brunberg 13 July 2018 в 12:40
  • 4
    @TomBrunberg Да, к сожалению, OP не сказал, какую версию Delphi он использует. Но вы правы, в предыдущих версиях ему нужно найти другое решение, например, ваш настраиваемый конвертер. – Marc Guillot 13 July 2018 в 13:05
  • 5
    @TomBrunberg в этом случае имеет функцию XMLTimeToDateTime на XSBuiltIns, доступную с Delphi 6. docwiki.embarcadero.com/Libraries/Tokyo/en/… – Marc Guillot 13 July 2018 в 13:28
Другие вопросы по тегам:

Похожие вопросы: