Преобразование значения TDateTime в США для правильного отображения в европейском формате

Есть ли простой способ преобразовать значение TDateTime в США 17 апреля 2014 г., 20:35:38 по тихоокеанскому времени в европейский формат, который выглядит следующим образом: 2014-04-17 20:35:38 сильный>?

РЕДАКТИРОВАТЬ:

У меня есть строка, содержащая необработанную дату/время в формате США:

var s, new_s: string;
begin
  s := 'Apr 17, 2014 8:35:38 PM PDT';

Я хочу как-то прочитать/разобрать эту строку в переменную типа TDateTime -или- просто преобразовать ее в другую строку нужного формата:

  new_s := MyConvertDateTimeSring(s);
  // now new_s must be '2014-04-17 20:35:38';
end; 

(Дельфи ХЕ4)


person Interface Unknown    schedule 04.05.2014    source источник
comment
Глобального европейского формата не существует. Например, мы используем формат 17.4.2014 20:35:38 в чешском языке. Формат для каждой страны.   -  person TLama    schedule 05.05.2014
comment
Вы же понимаете, что переменная TDateTime на самом деле не в ни одном из этих форматов, верно? Вы можете отформатировать дату, используя любой формат строки, который вы хотите.   -  person Rob Kennedy    schedule 05.05.2014
comment
Ваш вопрос, безусловно, заключается в том, как проанализировать дату/время string до даты value.   -  person David Heffernan    schedule 05.05.2014
comment
@TLama Я не имею в виду какой-либо глобальный европейский формат. Многие локали предполагают разные разделители. На самом деле, я просто хочу избавиться от американского формата. Так что любое преобразование в гггг-мм-дд ЧЧ:мм:сс сделает меня счастливым.   -  person Interface Unknown    schedule 05.05.2014
comment
@RobKennedy, как мне это сделать?   -  person Interface Unknown    schedule 05.05.2014
comment
Роб говорит о TDateTime, а вы говорите о строке, содержащей некоторые символы, представляющие дату, время и часовой пояс (теперь мы знаем это после вашего редактирования)   -  person Sir Rufo    schedule 05.05.2014
comment
Кроме того, какая европейская страна пишет такие даты   -  person David Heffernan    schedule 05.05.2014
comment
@DavidHeffernan мой SQL Server делает :) Думаю, решение состоит в том, чтобы проанализировать строку и собрать дату в нужном мне формате. Потому что, если бы было более простое решение, вы бы сказали мне;)   -  person Interface Unknown    schedule 05.05.2014
comment
Не передавать текст в базу данных. Не храните даты в виде текста.   -  person David Heffernan    schedule 05.05.2014
comment
@DavidHeffernan, я не знаю, Дэвид. Я использую 8-байтовый тип datetime. Спасибо, что упомянули об этом. Хранимые процедуры моего SQL Server используют разные параметры типа datetime. exec myStoredProc '2014-04-17 20:21:22' работает так же, как 17.04.2014 и 17/04/2014. Единственным непринятым форматом является тема вопроса.   -  person Interface Unknown    schedule 05.05.2014
comment
Вы должны отвечать на вопросы точнее. ДХ: который... так пишет даты? ОП: мой SQL Server делает, и теперь вы говорите, что хотите сохранить эту информацию на сервере sql, вы не получили это оттуда ...   -  person Sir Rufo    schedule 05.05.2014
comment
@SirRufo Мой вопрос не о SQL Server. Речь идет о синтаксическом анализе строки данных в желаемое значение даты и времени (как упоминал Дэвид выше). И вы прекрасно ответили на это. Никого не волнует, как я использую строку, когда она правильно отформатирована ;) СПАСИБО.   -  person Interface Unknown    schedule 05.05.2014


Ответы (1)


Если вы удалите TimeZone PDT из строки, вы можете использовать VarToDateTime для преобразования строки в значение TDateTime

var
  LDateTimeStr : string;
  LDateTime : TDateTime;
begin
  LDateTimeStr := 'Apr 17, 2014 8:35:38 PM PDT';
  LDateTime := VarToDateTime( Copy( LDateTimeStr, 1, 23 ) );
  WriteLn( FormatDateTime( 'yyyy-mm-dd hh:nn:ss', LDateTime ) );
end;

Результат будет

2014-04-17 20:35:38

person Sir Rufo    schedule 04.05.2014
comment
Большой! Большое спасибо. VarToDateTime и FormatDateTime будут моим вечерним чтением на сегодня :) На самом деле LDateTime := VarToDateTime(Copy(LDateTimeStr, 1, Pos(' PDT', LDateTimeStr))); будет немного точнее, так как может быть 7 апреля вместо 17 апреля. - person Interface Unknown; 05.05.2014
comment
Эта часть часового пояса может быть очень важной информацией здесь. - person TLama; 05.05.2014
comment
@TLama Это верно, но это не часть этого вопроса; о) - person Sir Rufo; 05.05.2014