Подтвердить что ты не робот

Обратная функция 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');
4b9b3361

Ответ 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.