2015-01-19 3 views
3

данных Я имеюКак конвертировать даты и время в разных форматах?

У меня есть данные, хранящиеся в базе данных, которая имеет дату и время хранится в виде строки.

Данные хранятся на центральном сервере. В этих данных дата и время хранится в разных форматах (изменяется в соответствии с форматом даты для машин-клиентов).

Я хотел сделать

Теперь я хочу, чтобы преобразовать эти все различные отформатированный даты и времени строки в «гггг-мм-дд чч: мм: сс» формат.

Проблема я столкнулся

Я не в состоянии преобразовать даты и времени данных с форматом время множественной даты в единый формат.

Пример: Моя машина формат времени дата гггг-мм-дд. , но когда я пытаюсь преобразовать дату ниже

StrToDateTime('2015/02/10') 

Он бросает исключение.

Может ли кто-нибудь сказать мне, как я могу это достичь? Пожалуйста, дайте мне знать, если требуется более подробная информация. Спасибо заранее.

+2

К сожалению, это конечный результат плохого кодирования. Дата 02/10/15 может быть 10 февраля 2015 года, 2 октября 2015 года или 15 октября 2002 года. Решение состоит в том, чтобы не хранить его в этом формате в первую очередь. –

+0

Замените символы '/' на '-'. –

+0

На какой машине вы собираетесь выполнить преобразование? Тот же самый компьютер, который написал данные? Большой урок, который можно извлечь из этого, заключается в том, что форматирование дат, чисел и т. Д. Должно рассматриваться как проблема отображения и/или ввода. Храните данные внутренне в четко определенном формате. Только на границе программы интерфейс с пользователем должен использовать форматирование локали. –

ответ

7

Вам необходима настройка формата дата пользовательской, так:

procedure Test; 
var 
    DT: TDateTime; 
    FS: TFormatSettings; 

begin 
    FS:= TFormatSettings.Create; 
    FS.DateSeparator:= '/'; 
    FS.ShortDateFormat:= 'yy/m/d'; 
    DT:= StrToDateTime('2015/02/10', FS); 
    Writeln(FormatDateTime('dd mm yyyy', DT)); 
end; 
+0

Хотя это правда, я боюсь, что проблема OP еще глубже - база данных уже содержит различные варианты настроек форматирования. –

+0

Если в существующих данных есть разные форматы, вам нужно будет иметь некоторую логику для изучения данных, определения формата и затем выбрать строку формата, используемую в StrToDateTime. Предполагая, что существует разумное количество форматов, это должно быть хорошо, если вы можете справиться с двусмысленностью (на оригинальном комментарии Джерри Доджа). –

+0

Спасибо за ответ ... Но проблема существует только из-за того, что дата и время хранились в разных форматах. –

1

В этой процедуре ошибка, потому что не может быть использован FS: = TFormatSettings.Create; TformatSettings зарезервирован только для системы. У метода TformatSettings нет метода Create. На этой линии компилятора сказать, что Craeate не знает Ий я порекомендован эту процедуру для преобразования из одной строки в другую строку в другом формате

enter code here 

Procedure TForm4.ConvertDate(var DataValue:string); 
var 
     AFormatSettings:TFormatSettings; 
     ALocaleID: integer; 
     DateTym :TdateTime; 

begin 
DataValue:=StringReplace(DataValue, '/',{OldPattern} '-', {NewPattern}  
       [rfReplaceAll, rfIgnoreCase] {Flags:TreplaceFlags});  
    //this StringReplace must be used because with Separator/for date  
    //occurs error   
GetLocaleFormatSettings(ALocaleID, AFormatSettings); 
AFormatSettings.ShortDateFormat:='DD-MM-YYYY'; 
DateTym:=StrToDate(DataValue, AFormatSettings);  
AFormatSettings.ShortDateFormat:='YYYY-MM-DD';  
//AFormatSettings.ShortDateFormat:='MM-DD-YYYY'; //can be also used   
DataValue:=FormatDateTime(AFormatSettings.ShortDateFormat,DateTym);   

end;   

Не напуган, что система AFormatSettings будет изменить. Если вы выйдете из
, эта процедура настройки системы для AFormatSettings вернется к настройке по умолчанию, так как это локальная переменная

Смежные вопросы