カルチャにはインバリアントカルチャと呼ばれる特殊なカルチャが用意されています。 インバリアントカルチャでは、特定の言語や国・地域に依存しない書式が定義されています。 インバリアントカルチャを使用すると、ローカライズされる書式(例えば短い日付の形式d)を使って文字列化する場合でも、実行環境のカルチャの影響を受けず常に同じ結果が得られます。 インバリアントカルチャには、英語圏で使われるものを基本とする書式が用意されています。

インバリアントカルチャが特に有用となるのは、異なるカルチャ間で日時を扱う場合です。 例として、文字列形式で日時のデータをやり取りすることを考えます。 ja-JPの環境で "2013年4月1日" の日付を短い日付の形式dで文字列化すると "2013/04/01" (年月日の順)となります。 これを仮にファイルに記録したとして、ファイルから読み込んだ文字列 "2013/04/01" をParseメソッドで復元すると、同じja-JPの環境なら2013年4月1日という日付が復元されます。 一方、fr-FRの環境では "2013/01/04" という文字列をParseメソッドで復元しようとすると "2013日1月4年" と解釈され、異なる日付として復元されてしまいます。

次の例は、そのような状況を再現するものです。 この例では、Thread.CurrentThread.CurrentCultureに設定されているカルチャを変更することにより、異なるカルチャとなる環境で実行した場合の状況を再現しています。

文字列化した日時を異なるカルチャ間で扱おうとして失敗する例
Imports System
Imports System.Globalization
Imports System.Threading

Class Sample
  Shared Sub Main()
    Dim now As DateTime = DateTime.Now

    ' ja-JPの環境において、短い日付の形式で文字列化したとする
    Thread.CurrentThread.CurrentCulture = New CultureInfo("ja-JP")

    Dim str As String = now.ToString("d")

    Console.WriteLine(str)

    ' fr-FRの環境において、文字列で表された日付を復元しようとする
    Thread.CurrentThread.CurrentCulture = New CultureInfo("fr-FR")

    ' 解析に失敗するため、ここでFormatExceptionがスローされる
    Console.WriteLine(DateTime.ParseExact(str, "d", Nothing))
    ' ハンドルされていない例外: System.FormatException: 文字列は有効な DateTime ではありませんでした。
    '    場所 System.DateTimeParse.ParseExact(String s, String format, DateTimeFormatInfo dtfi, DateTimeStyles style)
    '    場所 Sample.Main()
  End Sub
End Class
ja-JPでの実行結果例
2013/04/01
04/01/2013

こういった問題を避けるためには、変換時と復元時でカルチャが異なる場合でも同じ形式となる書式を使う必要があります。 この例のようにローカライズされる書式で文字列化しなければならない場合でも、インバリアントカルチャを使えばこういった問題を避けることができます。

一般的にこういった場合はローカライズされない書式を使うことが推奨されます。 ISO8601(W3C-DTF)形式oやRFC1123形式rなどはローカライズされない書式であり、また言語や処理系にも依存しないフォーマットであるため、異なる実行環境や処理系との日時のやりとりに向いています。 これ以外の定義済みの書式については書式指定子 §.日付と時刻の書式指定子を参照してください。

インバリアントカルチャについてより詳しくはカルチャの基本とカルチャ情報 §.インバリアントカルチャをご覧ください。