При одинаковых настройках культуры на локальном компьютере и сервере используются разные 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."
        }
    }
}

0 ответов

Другие вопросы по тегам