FormatDateTime的反函数

时间:2010-03-23 20:42:52

标签: delphi

我正在寻找一个函数来反转由函数{{3}创建的任何字符串(YYYYMDDYY/MM/DDYYMMDD,...)到日期时间。

例如

我有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');

8 个答案:

答案 0 :(得分:9)

使用RX软件包中的rxDateutil.pas单元中的现有解决方案StrToDateFmt函数非常容易,可以在此处下载:http://sourceforge.net/projects/rxlib/

编辑:

上面提到的函数和来自rxDateutil.pas的StrToDateFmt完全符合您的预期,使用指定的字符串掩码将字符串转换为日期时间,代码太大而无法包含,因为此单元还包含其他日期函数,其中一些是必需的将字符串转换为日期。

使用示例:

Result := StrToDateFmtDef('MM/DD/YYYY', '11/11/2011', Now);

答案 1 :(得分:5)

我喜欢Tuncay的答案,但有一些问题。我已经发表了评论,但我没有足够的声望点。

所以,这是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');

答案 2 :(得分:3)

您可以使用属于StrToDateFmt的JvJCLUtils单位的JEDI Code Library函数

在你的情况下:

Function InvFormatDatetime ( dateString :String; dateFormat :String ) : TDateTime;
begin
   Result := JvJCLUtils.StrToDateFmt ( dateFormat, dateString );
end;

答案 3 :(得分:3)

不使用任何外部库,您可以执行以下操作:

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');

我没有编译过这个,但这个想法很简单。

答案 4 :(得分:1)

你检查过StrToDate和StrToDateTime吗?

答案 5 :(得分:0)

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;

问候

答案 6 :(得分:0)

我知道为时已晚,但是只是出于兴趣,从Delphi XE6开始,您现在可以执行以下操作

uses
  System.DateUtils;
var
  dt: TDateTime;
begin
  dt := ISO8601ToDate('20190408');
end.

dt现在将是2019/04/08

答案 7 :(得分:-3)

通常情况下,我只需插入使StrToDate工作所需的字符。