私のコンピューターは、 ではないen-US
カルチャで構成されています。
ネイティブの Win32GetDateFormat
関数を使用すると、正しくフォーマットされた日付が取得されます。
- 22//11//2011 4::42::53P̰̃M]
正解です; また、Windows がそれをレンダリングする方法でもあります。
タスクバー
地域と言語の設定
ウィンドウズ・エクスプローラ
見通し
現在のロケールを使用して.NETで日付を文字列に変換しようとすると、次のようになります。
DateTime.Now.ToString();
DateTime.Now.ToString(CultureInfo.CurrentCulture);
私は間違った日付を取得します:
- 22////11////2011 4::::42::::53P̰̃M]
.NET のこのバグは、バグのある .NET コードを使用する Windows のどこでも明らかです。
Windows イベント ビューアー:
タスク スケジューラ:
SQL Server 管理スタジオ:
.NET にバグがないようにするにはどうすればよいですか?
現在のカルチャを使用して (正しく) 日付と時刻を文字列に変換するにはどうすればよいですか?
注: ユーザーは、 Windows を任意のロケール設定に設定できます。現在、私のプログラムは 有効な設定を適切に処理しません。ユーザーに「そんなことはしないでください」と言うのはかなり意地悪です。
同様の例が Delphi から来ています。Delphi では、日付区切り記号が複数の文字であってはならないことを前提としています。Windows が、日付区切り文字に複数の文字を使用するロケールで構成されている場合:
- sk-SK (スロバキア - スロバキア) :
.
日付は次のようにフォーマットする必要があります。
22. 11. 2011
コード ライブラリは、1 文字を超える日付区切り記号を受け入れることができず、次のようにフォールバックします。
22/11/2011
過去には、そのような極端なケースを気にしないようにと提案する人もいたかもしれません。そのような提案は私にとって重要ではありません。
タイトルを変更して私の質問の意味を変えようとする人との小競り合いは避けたいと思います。しかし問題は、アプリケーションのバグを見つけるために特別に設計された疑似ロケールに限定されません。
ボーナスおしゃべり
以下は、世界中の日付形式のユニークなリストです。
- 11.11.25
- 2011.11.25
- 2011/11/25
- 2011.11.25
- 2011.11.25.
- 2011/11/25
- 2011-11-25
- 2011年
- 11.11.25
- 2011.11.25
- 2011 年 11 月 25 日。
- 2011.11.25。
- 2011/11/25
- 2011年11月25日
- 2011/11/25
- 2554/11/25
- 25-11-11
- 2011 年 11 月 25 日
- 29/12/32
特に興味深いのは、グレゴリオ暦を使用しない最後の例です。
- アラビア語 (サウジアラビア)
ar-SA
: 29/12/32 02:03:07 ã - ディベヒ (モルディブ)
dv-MV
: 29/12/32 14:03:07 - Dari/Pashto (アフガニスタン)
prf-AF / ps-AF
: 29/12/32 2:03:07 غ.و
これらは、心配する必要のない特殊なケースですが。
2011 年 12 月 14 日更新:
バグの別のデモンストレーションは、Datetime.Parse
解析できないことDateTime.ToString
です:
String s = DateTime.Today.ToString("d"); //returns "14////12////2011"
DateTime d = DateTime.Parse(s); //expects "dd//MM//yyyy"
は.Parse
例外をスローします。
更新 02//8、2012 09::56'12:
日付区切り文字の使用は、正しくないだけでなく、非推奨です。MSDN から:
LOCALE_SDATE
Windows Vista 以降:この定数は非推奨です。
LOCALE_SSHORTDATE
代わりに使用してください。カスタム ロケールには、1 つの統一された区切り文字がない場合があります。たとえば、「2006 年 12 月 31 日」などの形式が有効です。LOCALE_STIME
Windows Vista 以降:この定数は非推奨です。
LOCALE_STIMEFORMAT
代わりに使用してください。カスタム ロケールには、1 つの統一された区切り文字がない場合があります。たとえば、「03:56'23」などの形式が有効です。