4

ISO 8601 では、ダッシュを使用しない、いわゆる基本的な日付形式について説明しています。

20140507 は、より読みやすい 2014-05-07 の有効な表現です。

その基本的な形式を解釈して TDateTime 値に変換できる Delphi RTL 関数はありますか?

私は試した

function TryIso2Date(const _s: string; out _Date: TDateTime): Boolean;
var
  Settings: TFormatSettings;
begin
  Settings := GetUserDefaultLocaleSettings;
  Settings.DateSeparator := #0;
  Settings.ShortDateFormat := 'yyyymmdd';
  Result := TryStrToDate(_s, Date, Settings);
end;

TryIso2Date('20140507', dt);

しかし、文字列に DateSeparator が見つからなかったため、機能しませんでした。

これまでに思いついた唯一の解決策 (解析コードを自分で書く以外) は、TryStrToDate を呼び出す前に不足しているダッシュを追加することです。

function TryIso2Date(const _s: string; out _Date: TDateTime): Boolean;
var
  Settings: TFormatSettings;
  s: string;
begin
  Settings := GetUserDefaultLocaleSettings;
  Settings.DateSeparator := #0;
  Settings.ShortDateFormat := 'yyyy-mm-dd';
  s := Copy(_s,1,4) + '-' + Copy(_s, 5,2) + '-' + Copy(_s, 7);
  Result := TryStrToDate(_s, Date, Settings);
end;

TryIso2Date('20140507', dt);

これは機能しますが、かなりぎこちなく感じます。

これは Delphi XE6 であるため、可能な限り最新の RTL を使用する必要があります。

4

1 に答える 1

2

を使用Copyして、既に行っているように値を引き出すことができます。そして、日付をエンコードするだけです:

function TryIso8601BasicToDate(const Str: string; out Date: TDateTime): Boolean;
var
  Year, Month, Day: Integer;
begin
  Assert(Length(Str)=8);
  Result := TryStrToInt(Copy(Str, 1, 4), Year);
  if not Result then
    exit;
  Result := TryStrToInt(Copy(Str, 5, 2), Month);
  if not Result then
    exit;
  Result := TryStrToInt(Copy(Str, 7, 2), Day);
  if not Result then
    exit;
  Result := TryEncodeDate(Year, Month, Day, Date);
end;
于 2014-06-08T17:35:34.703 に答える