Обратная функция FormatDateTime
Я ищу функцию для YYYYMDD
любой строки (YYYYMDD
, YY/MM/DD
, YYMMDD
,...), созданной функцией FormatDateTime, к дате и времени.
пример
У меня есть строковая дата в формате YYYYMMDD
созданная FormatDateTime
mydatestr:=FormatDateTime('YYYYMMDD',Mydate);
Теперь, как я могу снова конвертировать mydatestr в DateTime
?
ОБНОВИТЬ
эти функции
function StrToDate(const S: string): TDateTime; overload;
function StrToDate(const S: string;
const FormatSettings: TFormatSettings): TDateTime; overload;
function StrToDateTime(const S: string): TDateTime; overload;
function StrToDateTime(const S: string;
const FormatSettings: TFormatSettings): TDateTime; overload;
не поддерживает передачу строки с форматом для преобразования.
Я смотрю что-то вроде этого
Mydatetime:=InvFormatDatetime('20091225','yyyymmdd');
или же
Mydatetime:=InvFormatDatetime('20090108','yyyyddmm');
Ответы
Ответ 1
С существующим решением, StrToDateFmt-функцией в модуле rxDateutil.pas из пакета RX довольно просто: http://sourceforge.net/projects/rxlib/
EDIT:
Упомянутая выше функция и StrToDateFmt из rxDateutil.pas делают именно то, что вы ожидаете, преобразовывая строку в datetime с помощью указанной строковой маски, код слишком велик, чтобы быть включенным, поскольку этот блок содержит также другие функции даты, некоторые из которых необходимы для преобразование строки в дату.
Пример использования:
Result := StrToDateFmtDef('MM/DD/YYYY', '11/11/2011', Now);
Ответ 2
Мне понравился ответ Тункай, но с ним было несколько проблем. Я бы оставил комментарий, но у меня недостаточно очков репутации.
Итак, здесь скорректированная версия ответа Tuncay (исправление "TFormatSetting" отсутствует "s" и задание разделителя дат формата):
function AnyStringToDate(fmt, dt: String) : TDateTime;
var
fs : TFormatSettings;
Begin
fs := TFormatSettings.Create;
fs.DateSeparator := '-';
fs.ShortDateFormat := fmt;
result := StrToDateDef(dt, 0, fs);
End;
Идентичный ответ Tuncay, AnyStringToDate можно использовать следующим образом:
mydate := AnyStringToDate('YYYY-MM-DD', '2015-01-20');
Ответ 3
Вы можете использовать StrToDateFmt функцию JvJCLUtils, принадлежащую JEDI Библиотека кода
в вашем случае:
Function InvFormatDatetime ( dateString :String; dateFormat :String ) : TDateTime;
begin
Result := JvJCLUtils.StrToDateFmt ( dateFormat, dateString );
end;
Ответ 4
Без использования внешней библиотеки вы можете сделать что-то вроде:
function AnyStringToDate(fmt, dt: String) : TDateTime;
var
fs : TFormatSettings;
Begin
fs := TFormatSettings.Create;
fs.ShortDateFormat := fmt;
result := StrToDateDef(dt, 0, fs);
End;
а затем используйте его как:
mydate := AnyStringToDate('YYYY-MM-DD', '2015-01-20');
Я havent скомпилировал это, но идея простая.
Ответ 5
Вы проверяли StrToDate и StrToDateTime?
Ответ 6
Function InvFormatDatetime (Cadena:String; Formato:String) : TDateTime;
Var
PosD, PosM, PosY : Integer;
sD, sM, sY : String;
begin
sd := '0';
sm := '0';
sy := '0';
If Length(Cadena) = Length(Formato) Then
Begin
Formato := UpperCase(Formato);
PosD := Pos('D',Formato);
PosM := Pos('M',Formato);
PosY := Pos('Y',Formato);
sd := Copy(Cadena,PosD,2);
sm := Copy(Cadena,PosM,2);
if Length(Cadena) = 6 then
begin
sy := Copy(Cadena,PosY,2);
if StrToInt(sy) > 50 then
sy := '19'+sy
else
sy := '20'+sy;
end
else
sy := Copy(Cadena,Posy,4);
End;
Result := EncodeDate(StrToInt(sY),
StrToInt(sM),
StrToInt(sD));
End;
привет
Ответ 7
Я знаю, что уже слишком поздно, но ради интереса, с Delphi XE6 и далее вы можете делать следующее
uses
System.DateUtils;
var
dt: TDateTime;
begin
dt := ISO8601ToDate('20190408');
end.
ДТ теперь будет 2019/04/08
Ответ 8
Обычно я просто вставлял символы, необходимые для работы StrToDate.