При одинаковых настройках культуры на локальном компьютере и сервере используются разные AMDesignators
обзор
последовательный 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
- Локальная ОС: Windows 10 Pro
- Серверная ОС: Windows Server 2012 R2, версия 6.3
Фон
Я пишу модульный тест, который я хотел бы вести себя одинаково независимо от того, где этот тест выполняется. Для этого я создал собственный атрибут, чтобы вручную установить текущий CultureInfo
машины на время теста. Таким образом, если я запускаю тест локально в Новой Зеландии, он все равно будет вести себя так же, как при запуске на сервере AWS в Соединенных Штатах (в этом случае для обеспечения согласованного форматирования строк даты, где Новая Зеландия = дд / мм / гггг и Соединенные Штаты = мм / дд / гггг) или где-либо еще в мире.
Пока что пользовательский атрибут правильно устанавливает параметры культуры устройства и правильно форматирует дату и время между Новой Зеландией (дд / мм / гггг) и США (мм / дд / гггг), за исключением того, что мой локальный компьютер выводит "AM" после время, пока сервер выводит "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."
}
}
}