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);
|