フリーソフト

日付時刻の処理

[BCB] FILETIMEをTDateTimeに変換

// TFileTime型をTDateTime型に変換する
TDateTime __fastcall TForm1::FileTimeToDateTime(TFileTime FileTime)
{
  TFileTime LocalTime;
  TSystemTime SystemTime;

  if ((FileTime.dwLowDateTime==0) && (FileTime.dwHighDateTime==0)) return 0;

  FileTimeToLocalFileTime(&FileTime,&LocalTime);
  FileTimeToSystemTime(&LocalTime,&SystemTime);
  return SystemTimeToDateTime(SystemTime);
}

[BCB] 世界協定時刻(UTC)をローカルタイムに変換

void __fastcall TForm1::Button1Click(TObject *Sender)
{
 TSystemTime STime,LTime;
 TIME_ZONE_INFORMATION TzInfo;

 //タイムゾーン情報を取得
 GetTimeZoneInformation( &TzInfo );
 //現在のシステム時刻(UTC)を取得
 GetSystemTime(&STime);

 //タイムゾーン情報を使ってローカルタイムに変換
 SystemTimeToTzSpecificLocalTime(&TzInfo,&STime,&LTime);

 //結果を表示
 AnsiString Str;
 Str.printf("%02d:%02d:%02d",LTime.wHour,LTime.wMinute,LTime.wSecond);
 Label1->Caption=Str;
}

[BCB] TSystemTime(_SYSTEMTIME)とTDateTimeの変換

TSystemTimeをTDateTime型に変換

void __fastcall TForm1::Button1Click(TObject *Sender)
{
 TDateTime DateTime;
 TSystemTime SystemTime;

 GetLocalTime(&SystemTime);
 //変換
 DateTime=SystemTimeToDateTime(SystemTime);
}

TDateTimeをTSystemTimeに変換

void __fastcall TForm1::Button1Click(TObject *Sender)
{
 TDateTime DateTime;
 TSystemTime SystemTime;

 DateTime=Now();
 //変換
 DateTimeToSystemTime(DateTime,&SystemTime);
}

[BCB] 世界協定時刻(UTC)を取得する

GetSystemTimeを使用します。引数にはTSystemTime構造体へのポインタを指定します。

void __fastcall TForm1::Button1Click(TObject *Sender)
{
 TSystemTime Stime;
 GetSystemTime(&Stime);

 AnsiString Str;
 Str.printf("%d/%d/%d",Stime.wYear,Stime.wMonth,Stime.wDay);
 Lable1->Caption=Str;
}

TSystemTime構造体には次の値が格納されます。

wYear
wMonth
wDayOfWeek曜日(日:0、月:1、..、土:6)
wDay
wHour
wMinute
wSecond
wMillisecondsミリ秒

なお、ローカル時間はGetLocalTimeで取得することができます。

[Delphi] 修正ユリウス通日と年月日の変換

uses Math;

//年月日から修正ユリウス通日へ
function YMD2MJD(y,m,d:Integer):Integer;
begin
 if (m = 1) or (m = 2) then begin
  y:=y-1;
  m:=m+12;
 end;
 //フリーゲルの公式
 Result:=Floor(365.25*y) + (y div 400) - (y div 100) + Floor(30.59*(m-2)) + d -678912;
end;

//修正ユリウス通日から年月日へ
procedure MJD2YMD(mjd:Integer; var y,m,d:Integer);
var
 k:Integer;
begin
 y := Floor( (mjd - 15078.2) / 365.25 );
 m := Floor((mjd - 14956.1 - Floor(y*365.25)) / 30.6001 );
 d := mjd - 14956 - Floor(y*365.25) - Floor(m*30.6001);
 If (m = 14) or (m = 15) then k := 1
 else k := 0;
 y := y + k + 1900;
 m := m - 1 - k*12;
end;

ユリウス通日は紀元前4713年1月1日からの経過日数を表します。修正ユリウス通日はユリウス通日から2400000.5引いたものでMJD(Modified Julian Day)と略されます。ユリウス通日は2つの日付間の日数を計算したりするの使えます。とはいっても、標準で用意されている関数があるのでわざわざ実装することはないと思いますが。ご参考まで。 

[Delphi] 日付から曜日を計算する方法

y年m月d日の曜日(日曜が0、...、土曜が6)を求める方法です。
1月、2月は前年の13月、14月として計算します。

begin
 if (m = 1) or (m = 2) then begin
  y:=y-1;
  m:=m+12;
 end;
 Result:=(y + (y div 4) - (y div 100) + (y div 400) +((13*m+8) div 5) + d) mod 7;
end;

この式はZellerの公式というものです。
1582年10月15日(グレゴリオ暦施行日)以前については有効ではありませんのでご注意ください。