概要
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)
両方を、指定された提供されたものに設定します。CurrentCulture
CurrentUICulture
CultureInfo
結果 (ローカル | サーバー):
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."
}
}
}