Delphi-7:将yyyymmdd格式化的字符串(没有分隔符的格式)转换为DateTime对象

时间:2017-09-01 12:28:12

标签: delphi delphi-7

我正在使用 Delphi7

我的日期格式设置为 yyyymmdd (可以采用任何日期格式而不使用分隔符)。当我尝试StrToDate('20170901')时,它会抛出错误。

我想支持所有有效的日期格式(可以由不同区域的不同客户端使用。)

我尝试使用VarToDateTime,但它也无效。

如果DateToStr()也存在同样的问题,请引导我完成。

2 个答案:

答案 0 :(得分:6)

您收到错误,因为您的输入字符串与您日期/时间字符串的机器区域设置不符。

通常情况下,我建议您使用StrToDate()单元中的SysUtils函数,事先设置其全局ShortDateFormatDateSeparator变量,然后再恢复它们(Delphi 7)在引入TFormatSettings记录之前,例如:

uses
  ..., SysUtils;

var
  OldShortDateFormat: string;
  OldDateSeparator: Char;
  input: string;
  dt: TDateTime;
begin
  input := ...;

  OldShortDateFormat := ShortDateFormat;
  OldDateSeparator := DateSeparator;
  ShortDateFormat := 'yyyymmdd'; // or whatever format you need...
  DateSeparator := '/'; // or whatever you need
  try
    dt := StrToDate(input);
  finally
    ShortDateFormat := OldShortDateFormat;
    DateSeparator := OldDateSeparator;
  end;

  // use dt as needed...
end;

不幸的是,StrToDate() 要求输入字符串在日期组件之间有一个分隔符(即2017/09/01),但输入字符串不是(20170901 )。解析字符串时,StrToDate()不允许DateSeparator设置为#0,即使ShortDateFormat未指定任何分隔符的格式也是如此。

因此只留下一个选项 - 手动解析字符串以提取单个组件,然后使用EncodeDate()单元中的SysUtils函数,例如:

uses
  ..., SysUtils;

var
  wYear, wMonth, wDay: Word;
  input: string;
  dt: TDateTime;
begin
  input := ...;

  wYear := StrToInt(Copy(input, 1, 4));
  wMonth := StrToInt(Copy(input, 5, 2));
  wDay := StrToInt(Copy(input, 7, 2));
  // or in whatever order you need...

  dt := EncodeDate(wYear, wMonth, wDay);

  // use dt as needed...
end;

DateToStr()功能也受区域设置的限制。但是,它确实允许在输出中省略DateSeparator。所以,您可以:

  1. 使用DateToStr(),将全局ShortDateFormat变量设置为所需格式:

    uses
      ..., SysUtils;
    
    var
      OldShortDateFormat: string;
      dt: TDateTime;
      output: string;
    begin
      dt := ...;
    
      OldShortDateFormat := ShortDateFormat;
      ShortDateFormat := 'yyyymmdd'; // or whatever format you need...
      try
        output := DateToStr(dt);
      finally
        ShortDateFormat := OldShortDateFormat;
      end;
    
      // use output as needed...
    end;
    
  2. 使用TDateTime单元中的DecodeDate()函数从SysUtils中提取单个日期组件,然后使用年/月/日值格式化您自己的字符串你想要的:

    uses
      ..., SysUtils;
    
    var
      wYear, wMonth, wDay: Word;
      dt: TDateTime;
      output: string;
    begin
      dt := ...;
    
      DecodeDate(dt, wYear, wMonth, wDay);
      output := Format('%.4d%.2d%.2d', [wYear, wMonth, wDay]);
    
      // use output as needed...
    end;
    

答案 1 :(得分:5)

要将该字符串转换为TDateTime,请将字符串拆分为年,月和日组件,并将其传递给EncodeDate()函数。

var
  myStr: string;
  myDate: TDate;
begin
  myStr := '20170901';
  myDate := EncodeDate(
    StrToInt(Copy(MyStr, 1, 4)),
    StrToInt(Copy(MyStr, 5, 2)),
    StrToInt(Copy(MyStr, 7, 2))
  );
  ...
end;