1

概要

Cultureローカル マシンとサーバーの両方で一貫した設定が行われていますが、異なる形式DateTimeの文字列が生成されます。

local:  "22/11/2016 12:00:00 AM"
server: "22/11/2016 12:00:00 a.m."

環境

  • 言語: C# 6
  • プラットフォーム: .NET 4.6.1
  • ローカル OS: Windows 10 Pro
  • サーバー OS: Windows Server 2012 R2、バージョン 6.3

バックグラウンド

テストが実行される場所に関係なく、まったく同じように動作するユニットテストを作成しています。CultureInfoこれを行うために、テスト中のマシンの電流を手動で設定するカスタム属性を作成しました。このようにして、ニュージーランドでローカルにテストを実行しても、米国の AWS サーバーで実行しても同じように動作します (この場合、日付文字列の一貫したフォーマットを確保するため、ニュージーランド = dd/mm/yyyyと米国 = mm/dd/yyyy ) または世界の他の場所。

これまでのところ、カスタム属性はマシンのカルチャ設定を正しく設定し、ニュージーランド ( dd/mm/yyyy ) と米国 ( mm/dd/yyyy ) の間の日付と時刻を正しくフォーマットします。サーバーが「am」を出力している間 (以下のコードを参照してください。これはクラスのAMDesignatorプロパティです)。DateTimeFormatサーバーが指定された外部から書式設定を取得しているようですCultureInfoが、なぜこれが起こっているのですか? 何か不足していますか?

-とのCultureSwitcher.SetTo(CultureInfo culture)両方を、指定された提供されたものに設定します。CurrentCultureCurrentUICultureCultureInfo

結果 (ローカル | サーバー):

using (var poly = PAssert.Poly())
{
    var date = new DateTime(2016, 11, 22);

    // New Zealand culture
    using (CultureSwitcher.SetTo(new CultureInfo("en-NZ")))
    {
        var currentCulture = System.Threading.Thread.CurrentThread.CurrentCulture;
        var amDesignator = currentCulture.DateTimeFormat.AMDesignator;
        var currencySymbol = currentCulture.NumberFormat.CurrencySymbol;

        poly.IsTrue(() => System.Threading.Thread.CurrentThread.CurrentCulture.ToString() == "en-NZ");      // True | True
        poly.IsTrue(() => System.Threading.Thread.CurrentThread.CurrentUICulture.ToString() == "en-NZ");    // True | True
        poly.IsTrue(() => CultureInfo.CurrentCulture.ToString() == "en-NZ");                                // True | True
        poly.IsTrue(() => CultureInfo.CurrentUICulture.ToString() == "en-NZ");                              // True | True
        poly.IsTrue(() => amDesignator == "AM");                                                            // True | FALSE - expected "a.m."
        poly.IsTrue(() => date.ToString() == "22/11/2016 12:00:00 AM");                                     // True | FALSE - expected "22/11/2016 12:00:00 a.m."
    }
    // United States culture
    using (CultureSwitcher.SetTo(new CultureInfo("en-US")))
    {
        var culture = CultureInfo.CreateSpecificCulture("en-US");
        var amDesignator = culture.DateTimeFormat.AMDesignator;
        var currencySymbol = culture.NumberFormat.CurrencySymbol;

        poly.IsTrue(() => System.Threading.Thread.CurrentThread.CurrentCulture.ToString() == "en-US");      // True | True
        poly.IsTrue(() => System.Threading.Thread.CurrentThread.CurrentUICulture.ToString() == "en-US");    // True | True
        poly.IsTrue(() => CultureInfo.CurrentCulture.ToString() == "en-US");                                // True | True
        poly.IsTrue(() => CultureInfo.CurrentUICulture.ToString() == "en-US");                              // True | True
        poly.IsTrue(() => amDesignator == "AM");                                                            // True | True
        poly.IsTrue(() => date.ToString() == "11/22/2016 12:00:00 AM");                                     // True | True
    }
}

自分で試してみてください (結果 = ローカル | サーバー):

using System;
using System.Globalization;

namespace ConsoleApplication
{
    class Program
    {
        static void Main()
        {
            // New Zealand culture
            System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-NZ");
            System.Threading.Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture("en-NZ");

            Console.WriteLine(CultureInfo.CurrentCulture.DateTimeFormat.AMDesignator);                  // "AM" | "a.m."
            Console.WriteLine(CultureInfo.CreateSpecificCulture("en-US").DateTimeFormat.AMDesignator);  // "AM" | "AM"
            Console.WriteLine(CultureInfo.CreateSpecificCulture("en-NZ").DateTimeFormat.AMDesignator);  // "AM" | "a.m."

            // United States culture
            System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US");
            System.Threading.Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture("en-US");

            Console.WriteLine(CultureInfo.CurrentCulture.DateTimeFormat.AMDesignator);                  // "AM" | "AM"
            Console.WriteLine(CultureInfo.CreateSpecificCulture("en-US").DateTimeFormat.AMDesignator);  // "AM" | "AM"
            Console.WriteLine(CultureInfo.CreateSpecificCulture("en-NZ").DateTimeFormat.AMDesignator);  // "AM" | "a.m."
        }
    }
}
4

0 に答える 0