【C#】DateTime.ToStringでカルチャ(CultureInfo)を指定し、日時書式を制御する方法

目次

日時書式と「カルチャ(CultureInfo)」

C#でDateTime.ToString("d")DateTime.ToString("D")といった標準の書式指定子を使用すると、日付文字列を簡単に生成できます。

しかし、これらの標準書式指定子の出力結果は、プログラムを実行しているOSの「現在のカルチャ(地域設定)」に強く依存します

例えば、ToString("D")(長い日付形式)を実行した場合:

  • 日本(ja-JP)環境: 2025年12月1日
  • 米国(en-US)環境: Sunday, December 1, 2025

この動作は、サーバーが米国にあり、クライアント(ユーザー)が日本にいる場合など、意図しない書式で日付が表示される原因となります。

アプリケーションが特定の言語や地域(例: 常に米国の書式)で日付を出力する必要がある場合、ToStringメソッドにSystem.Globalization.CultureInfoオブジェクトを明示的に渡す必要があります。


CultureInfoToString メソッド

CultureInfoクラスは、数値、日付、通貨などの書式設定ルールを定義するものです。

DateTime.ToStringメソッドには、書式指定子("d"など)に加えて、IFormatProviderCultureInfoがこれを実装)を受け取るオーバーロード(引数が異なる同名メソッド)が用意されています。

構文: dateTime.ToString(string format, IFormatProvider provider)


コード例:カルチャによる出力の比較

DateTime.ToStringの標準指定子("d", "D", "f", "m")が、カルチャの指定によってどのように変化するかを比較します。

ここでは、**現在の環境(ja-JPと仮定)**でのデフォルト出力と、"en-US"(英語-米国)および"fr-FR"(フランス語-フランス)のカルチャを明示的に指定した場合の出力を示します。

using System;
using System.Globalization; // CultureInfo を使用するために必要
using System.Threading;

public class CultureSpecificDateTimeFormat
{
    public static void Main()
    {
        // 処理対象の日時 (2025年12月1日 月曜日 19:45:30)
        DateTime eventTime = new DateTime(2025, 12, 1, 19, 45, 30);

        // --- 比較対象のカルチャを準備 ---
        
        // 1. 米国 (英語)
        CultureInfo usCulture = new CultureInfo("en-US");
        
        // 2. フランス (フランス語)
        CultureInfo frCulture = new CultureInfo("fr-FR");

        // (参考: 現在のスレッドのカルチャを 'ja-JP' に設定)
        // (これにより、引数なしの ToString() が日本語書式になることを保証)
        Thread.CurrentThread.CurrentCulture = new CultureInfo("ja-JP");
        
        Console.WriteLine($"元のDateTime: {eventTime:O}");
        Console.WriteLine("----------------------------------------------------------");
        
        // --- 書式 "d" (短い日付) の比較 ---
        Console.WriteLine($"[書式 'd']");
        Console.WriteLine($"  (デフォルト ja-JP): {eventTime.ToString("d")}");
        Console.WriteLine($"  en-US : {eventTime.ToString("d", usCulture)}");
        Console.WriteLine($"  fr-FR : {eventTime.ToString("d", frCulture)}");

        // --- 書式 "D" (長い日付) の比較 ---
        Console.WriteLine($"\n[書式 'D']");
        Console.WriteLine($"  (デフォルト ja-JP): {eventTime.ToString("D")}");
        Console.WriteLine($"  en-US : {eventTime.ToString("D", usCulture)}");
        Console.WriteLine($"  fr-FR : {eventTime.ToString("D", frCulture)}");

        // --- 書式 "f" (完全な日時 - 短い時刻) の比較 ---
        Console.WriteLine($"\n[書式 'f']");
        Console.WriteLine($"  (デフォルト ja-JP): {eventTime.ToString("f")}");
        Console.WriteLine($"  en-US : {eventTime.ToString("f", usCulture)}");
        Console.WriteLine($"  fr-FR : {eventTime.ToString("f", frCulture)}");
        
        // --- 書式 "m" (月日) の比較 ---
        Console.WriteLine($"\n[書式 'm']");
        Console.WriteLine($"  (デフォルト ja-JP): {eventTime.ToString("m")}");
        Console.WriteLine($"  en-US : {eventTime.ToString("m", usCulture)}");
        Console.WriteLine($"  fr-FR : {eventTime.ToString("m", frCulture)}");
    }
}

出力結果:

元のDateTime: 2025-12-01T19:45:30.0000000
----------------------------------------------------------
[書式 'd']
  (デフォルト ja-JP): 2025/12/01
  en-US : 12/1/2025
  fr-FR : 01/12/2025

[書式 'D']
  (デフォルト ja-JP): 2025年12月1日
  en-US : Monday, December 1, 2025
  fr-FR : lundi 1 décembre 2025

[書式 'f']
  (デフォルト ja-JP): 2025年12月1日 19:45
  en-US : Monday, December 1, 2025 7:45 PM
  fr-FR : lundi 1 décembre 2025 19:45

[書式 'm']
  (デフォルト ja-JP): 12月1日
  en-US : December 1
  fr-FR : 1 décembre

カルチャに依存しない書式

もし、ログ出力やAPI連携など、**どのカルチャで実行されても必ず同じ形式(例: 2025-12-01)**で出力したい場合は、標準書式("d"など)を使用するべきではありません。

代わりに、"yyyy-MM-dd"のようなカスタム書式指定子を使用するか、InvariantCulture(インバリアント・カルチャ、どの地域にも属さない固定のカルチャ)を指定します。

using System;
using System.Globalization;

public class InvariantCultureExample
{
    public static void Main()
    {
        DateTime eventTime = new DateTime(2025, 12, 1, 19, 45, 30);

        // 1. InvariantCulture を指定 (en-US に近いが、より固定化されている)
        string invariantString = eventTime.ToString("d", CultureInfo.InvariantCulture);
        Console.WriteLine($"InvariantCulture ('d'): {invariantString}"); // 12/01/2025

        // 2. 推奨:カスタム書式を使用 (カルチャに依存しない)
        string customString = eventTime.ToString("yyyy-MM-dd HH:mm:ss");
        Console.WriteLine($"カスタム書式: {customString}");
    }
}

出力結果:

InvariantCulture ('d'): 12/01/2025
カスタム書式: 2025-12-01 19:45:30

まとめ

DateTime.ToString()の標準書式指定子(d, D, fなど)は、デフォルトではOSのカルチャ設定に依存して出力結果が変わります。

  • 特定の言語(例: 英語、フランス語)で出力したい場合: new CultureInfo("en-US") のように、対象のカルチャを生成し、ToString(format, culture)の引数として渡します。
  • ログやデータ交換など、常に固定の書式にしたい場合: InvariantCulture(インバリアント・カルチャ)を指定するか、"yyyy-MM-dd"のようなカスタム書式指定子を使用することが強く推奨されます。
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次