DateTime・DateTimeOffsetの文字列化に際してローカライズされる書式があるのと同様、ParseメソッドでもDateTime・DateTimeOffsetへの変換の際にローカライズされているものとして解釈される場合があります。
分かりやすい例として、"1/2/3"
という文字列がja-JP(日本語/日本)・en-US(英語/アメリカ合衆国)・fr-FR(フランス語/フランス)の各環境ではどのように変換されるかその違いを見てみます。
DateTime/DateTimeOffset.Parseメソッドでの変換結果が実行環境により異なる例
Imports System
Imports System.Globalization
Imports System.Threading
Class Sample
Shared Sub Main()
Dim input As String = "1/2/3"
For Each culture As String In New String() {"ja-JP", "en-US", "fr-FR"}
' カルチャを変更して文字列をDateTimeに変換
Thread.CurrentThread.CurrentCulture = New CultureInfo(culture)
Console.WriteLine("{0} ({1}) -> {2:o}", input, culture, DateTime.Parse(input))
Next
Console.WriteLine()
For Each culture As String In New String() {"ja-JP", "en-US", "fr-FR"}
' カルチャを変更して文字列をDateTimeOffsetに変換
Thread.CurrentThread.CurrentCulture = New CultureInfo(culture)
Console.WriteLine("{0} ({1}) -> {2:o}", input, culture, DateTimeOffset.Parse(input))
Next
Console.WriteLine()
End Sub
End Class
実行結果
1/2/3 (ja-JP) -> 2001-02-03T00:00:00.0000000 1/2/3 (en-US) -> 2003-01-02T00:00:00.0000000 1/2/3 (fr-FR) -> 2003-02-01T00:00:00.0000000 1/2/3 (ja-JP) -> 2001-02-03T00:00:00.0000000+09:00 1/2/3 (en-US) -> 2003-01-02T00:00:00.0000000+09:00 1/2/3 (fr-FR) -> 2003-02-01T00:00:00.0000000+09:00
上記のコードではThread.CurrentThreadを変更することで異なるカルチャに変更していますが、Thread.CurrentThreadのデフォルト値は実行環境によって異なるカルチャとなるため、つまり、実行環境によってParseメソッドの結果は異なることになります。 上記の例で言えば"1/2/3"
という文字列は、ja-JPの環境では "(200)1年/2月/3日"、en-USの環境では "1月/2日/(200)3年"、fr-FRの環境では "1日/2月/(200)3年" として解釈されます。 このように、Parseメソッドに渡す文字列によっては、実行環境・カルチャによって解析結果が異なる場合がある点に注意する必要があります。