Windowsの日付と時刻の設定の影響
1. 日付(短い形式)の影響
コントロールパネル→地域→日付と時刻の形式→日付(短い形式)
日付(短い形式)→ yyyy/MM/dd yyyy-MM-dd
FormatSettings.ShortDateFormat yyyyy/mm/dd yyyy/mm/dd
FormatSettings.DateSeparator / -
Dt := StrToDateTime('2025/12/30 12:34:56.789') OK エラー
Dt := StrToDateTime('2025-12-30 12:34:56.789') エラー OK
FormatDateTime('yyyy/mm/dd hh:mm:ss.zzz', Dt) 2025/12/30 12:34:56.789 2025-12-30 12:34:56.789
FormatDateTime('yyyy-mm-dd hh:mm:ss.zzz', Dt) 2025-12-30 12:34:56.789 2025-12-30 12:34:56.789
問題点:
   1. 日付の区切り記号が「-」の場合 FormatDateTime で区切り記号を「/」に指定しても「-」で出力される。
   2. 日付の区切り記号が「-」の場合 StrToDateTime の区切り記号が「/」だと実行時エラーなる。
対策:
   現在の日付の区切り記号を保存してから、アプリケーション内の日付の区切り記号を「/」に変更する。
   Ds_Org := FormatSettings.DateSeparator; // システムの日付分離記号を保存
   FormatSettings.DateSeparator := '/'; // アプリケーション内の日付分離記号を設定
2. 日本以外のロケール対策
国によって年月日の順序などが異なるのでアプリケーション内のロケールを日本語(日本)に設定して対策します。
例)
// 現在ロケールの書式情報を読み出す
Df_Org := FormatSettings.ShortDateFormat; // 日付短書式
Ds_Org := FormatSettings.DateSeparator; // 日付分離記号
Ts_Org := FormatSettings.TimeSeparator; // 時刻分離記号
// アプリケーション内標準ロケールを設定する
Application.UpdateFormatSettings := False; // アプリ実行中の地域設定の変更を無視する
FormatSettings := TFormatSettings.Create(1041); // アプリ内ロケールを日本語(日本)に設定する
FormatSettings.DateSeparator := '/'; // 日付分離記号
// 以下は念のため(将来の日本語Windowsの仕様変更対策)
FormatSettings.TimeSeparator := ':'; // 時刻分離記号
FormatSettings.ShortDateFormat := 'yy/mm/dd'; // 日付短書式
FormatSettings.LongDateFormat := 'yyyy/mm/dd'; // 日付長書式

これによって日本語以外のWindowsでの実行時エラーを回避できます。
必要に応じて表示出力書式にオリジナル書式を適用します。

参考
ロケール 1033 英語(米国) の 日付(短い形式)の一覧
   M/d/yyyy
   M/d/yy
   MM/dd/yy
   MM/dd/yyyy
   yy/MM/dd
   yyyy-MM-dd
   dd-MMM-yy

日付(短い形式)に影響を受ける 日付/時刻 に関するDelphiの関数/手続き
System.SysUtils.DateTimeToStr
   function StrToDateTime(const S: string): TDateTime;
   function StrToDateTime(const S: string; const AFormatSettings: TFormatSettings): TDateTime;
   function DateTimeToStr(const DateTime: TDateTime): string;
   function DateTimeToStr(const DateTime: TDateTime; const AFormatSettings: TFormatSettings): string;

System.SysUtils.FormatDateTime
   function FormatDateTime(const Format: string; DateTime: TDateTime): string;
   function FormatDateTime(const Format: string; DateTime: TDateTime; const AFormatSettings: TFormatSettings): string;

日付(短い形式)に影響されない 日付/時刻 に関するDelphiの関数/手続き
System.DateUtils
   function EncodeDateTime(const AYear, AMonth, ADay, AHour, AMinute, ASecond, AMilliSecond: Word): TDateTime;
   procedure DecodeDateTime(const AValue: TDateTime; out AYear, AMonth, ADay, AHour, AMinute, ASecond, AMilliSecond: Word);

戻る