喫茶XRAYトップページ

[スレッド全体
]

[11671] Re3:Lazarus返信 削除
2018/1/13 (土) 22:03:42 taka
日付文字列 → TDateTimeへの変換を試してみました。

結果

# Delphi
# VarToDateTime
1928/02/01 00:01:00 : 1928/2/1 0:1:0
1928/02/01 00:02:00 : 昭和3年2月1日0時2分
1928/02/01 00:03:00 : 昭3/2/1 0:3
1928/02/01 00:04:00 : S3/2/1 0:4
# StrToDateTime
1928/02/01 00:01:00 : 1928/2/1 0:1:0
1928/02/01 00:02:00 : 昭和3年2月1日0時2分
1928/02/01 00:03:00 : 昭3/2/1 0:3
Error : 2003/02/01 00:04:00 : S3/2/1 0:4

# FPC
# VarToDateTime
1928/02/01 00:01:00 : 1928/2/1 0:1:0
Error : 昭和3年2月1日0時2分
Error : 昭3/2/1 0:3
Error : S3/2/1 0:4
# StrToDateTime
Error : 1928/2/1 0:1:0
Error : 昭和3年2月1日0時2分
Error : 昭3/2/1 0:3
Error : S3/2/1 0:4

 ---------------------

コード

procedure TForm1.Button1Click(Sender: TObject);
 const data : array[0..3] of string = (
          '1928/2/1 0:1:0',
          '昭和3年2月1日0時2分',
          '昭3/2/1 0:3',
          'S3/2/1 0:4');
 var
   i: integer;
   JPNEraFormat: TFormatSettings;
   strDate, strDate2 : String;
   timestamp: TDateTime;
begin
{$ifndef FPC}
  JPNEraFormat := TFormatSettings.Create('ja-JP');
{$ENDIF}
  JPNEraFormat.ShortDateFormat := 'ggee/m/d';

  Memo1.Lines.Text := '# '+ {$ifdef FPC}'FPC'{$ELSE}'Delphi'{$ENDIF};

  Memo1.Lines.Add('# VarToDateTime');
  for i:=low(data) to high(data) do
  try
    strDate2 := FormatDateTime('yyyy/mm/dd hh:mm:ss',
                    VarToDateTime(data[i]));
    strDate2 := strDate2 + ' : ' + data[i];
    if ('1928' <> Copy(strDate2, 1, 4)) then
      Memo1.Lines.Add('Error : '+ strDate2)
    else
      Memo1.Lines.Add(strDate2);
  except
    Memo1.Lines.Add('Error : ' + data[i]);
  end;

  Memo1.Lines.Add('# StrToDateTime');
  for i:=low(data) to high(data) do
  try
    strDate := data[i];
    strDate := StringReplace(strDate, '年', '/', []);
    strDate := StringReplace(strDate, '月', '/', []);
    strDate := StringReplace(strDate, '日', ' ', []);
    strDate := StringReplace(strDate, '時', ':', []);
    strDate := StringReplace(strDate, '分', '', []);
    strDate2 := FormatDateTime('yyyy/mm/dd hh:mm:ss',
                    StrToDateTime(strDate,JPNEraFormat));
    strDate2 := strDate2 + ' : ' + data[i];
    if ('1928' <> Copy(strDate2, 1, 4)) then
      Memo1.Lines.Add('Error : '+ strDate2)
    else
      Memo1.Lines.Add(strDate2);
  except
    Memo1.Lines.Add('Error : ' + data[i]);
  end;
end;



[11672] 日付文字列 → TDateTimeへの変換返信 削除
2018/1/14 (日) 11:06:09 taka
VarToDateTime, StrToDateTime
を使った日付変換は、
fpcで見事に撃沈されてしまいましたが

Win apiのVarDateFromStrを使えば
fpcで日付の変換ができることがわかりました。

FPCは、 Active-X / OLE objects に対応していないので
関数を自分で定義する必要あります

結果
# Delphi
H30/1/2 3:2:1 ---> 2018/01/02 03:02:01
平成30年3月1日 ---> 2018/03/01 00:00:00

# FPC
H30/1/2 3:2:1 ---> 2018/01/02 03:02:01
平成30年3月1日 ---> 2018/03/01 00:00:00

 code[utf-8] -----------------------

{$ifdef fpc}
//{$codepage utf-8}
function VarDateFromStr(const strIn: WideString; alcid: DWORD;
    dwFlags: Longint; out dateOut: Double): HRESULT; stdcall;
    external 'OleAut32.dll' name 'VarDateFromStr'; overload;
function VarDateFromStr(const strIn: WideString; alcid: DWORD;
        dwFlags: Longint; out dateOut: TDateTime): HRESULT; stdcall;
        external 'OleAut32.dll' name 'VarDateFromStr'; overload;
// https://msdn.microsoft.com/en-us/library/windows/desktop/ms221395(v=vs.85).aspx
// TDateTime, DATE型は0の開始日は同じ
{$endif}

procedure TForm1.Button2Click(Sender : TObject);
  const dataText : array[0..1] of WideString = (
                   'H30/1/2 3:2:1', '平成30年3月1日');
// fpc: 「ファイル設定 : エンコード: UTF8-BOM付き」以外になっていると漢字が破損します
  var
      Adatetime : TDateTime;
      i : Integer;
      s : string;
begin
  Memo1.Lines.Text := '# '+ {$ifdef FPC}'FPC'{$ELSE}'Delphi'{$ENDIF};
  for i:=0 to High(dataText) do
  begin
    Adatetime := 0;
    s := dataText[i] + (' ---> ');
    if (S_OK = VarDateFromStr({$ifdef FPC}dataText[i]{$ELSE}PWideChar(dataText[i]){$ENDIF}
             , GetThreadLocale, LOCALE_NOUSEROVERRIDE, Adatetime)) then
      s := s + FormatDateTime('yyyy/mm/dd hh:mm:ss', VarToDateTime(Adatetime));
    Memo1.Lines.Add(s);
  end;
end;



[▼次のスレッド]
INCM/CMT
Cyclamen v3.82