В моем случае проблема заключалась в невозможности дифференциации Eclipse между двумя разными копиями одного и того же проекта. У меня есть одна блокировка на багажнике (контроль версий SVN), а другой - в одной ветви за раз. Я опробовал одно изменение в рабочей копии как тестовый пример JUnit, который включал в себя извлечение частного внутреннего класса для самостоятельного публичного класса, и пока он работал, я открываю другую копию проекта, чтобы посмотреть вокруг на другой часть кода, которая нуждается в изменениях. В какой-то момент NoClassDefFoundError
появился, жалуясь, что частного внутреннего класса не было; двойной щелчок в трассировке стека привел меня к исходному файлу с неправильной копией проекта.
Закрытие внешней копии проекта и запуск тестового примера снова избавилось от проблемы.
Успех преобразования из 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;
Попробуйте функцию StrToDateTime
, которая преобразует значение даты string
DateTime в значение TDateTime
. Обратите внимание, что формат даты и времени должен быть текущим системным форматом даты / времени, иначе он выдает исключение. Пример: StrToDateTime('2018-07-11 12:34:56');
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