.NETとSilverlightで(デフォルトの)日付の書式が違う件

.NETとSilverlightでは日付の書式が違うことに気が付いた。

例えば以下のようなコードの場合、

DateTime.Now.ToString();
.NET

2008/04/18 10:00:00

Silverlight

平成 20/4/8 10:00:00

というように結果が異なる。

これは.NETとSilverlightでは日本語Cultureの内容が異なるためにおこっているみたい。

現在のカルチャーの情報を調べてみればそれがわかる。

Console.WriteLine(
    System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.FullDateTimePattern
);

.NET

yyyy'年'M'月'd'日' H:mm:ss

Silverilght

gg y'年'M'月'd'日' H:mm:ss

DateTime型に対して引数なしのToStringメソッドを呼び出すと*1この書式に従うことになるので、Silverlight側からサーバーサイドに対して日付の値を送る時は明示的に書式を指定した方がよさそうだ。*2

DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ss")
出力

2008-04-08T00:00:00

[追記]
上記の方法ではSiliverlightでは「20-04-08T00:00:00」と西暦ではなく年号で表示されてしまう。これは日本語のカルチャーがそうなっているから。

なのでSilverilghtで年の部分を西暦で表示するには、

var now = DateTime.Now;
now.ToString(now.Year + "-MM-ddTHH:mm:ss")

とするか、

DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ss",
    CultureInfo.InvariantCulture
);

英語圏インヴァリアントなカルチャーを指定してToStringするかのどちらかになる。

*1:もしくはstring型にキャストすると

*2:実際これではまってしまったorz