Подтвердить что ты не робот

Вывод времени (AM/PM) изменился в Windows 10 при использовании DateTime.ToString( "tt" )

Недавно я обновился до Windows 10 - и теперь я вижу некоторые довольно неожиданные изменения в выходе даты при использовании спецификатора формата "tt".

Вот какой код, который демонстрирует проблему:

using System.IO;
using System;
using System.Globalization;
using System.Threading.Tasks;

class Program
{
    static void Main()
    {
        var cultures = new string[] {null, "en-NZ", "en-US", "en-AU", "en-GB"};

            foreach (var culture in cultures) {
                if (culture != null) {
                    var c = CultureInfo.GetCultureInfo(culture);
                    System.Threading.Thread.CurrentThread.CurrentCulture = System.Threading.Thread.CurrentThread.CurrentUICulture = c;
                }

                DateTime dt = new DateTime(2015, 1, 2, 3, 4, 5, DateTimeKind.Utc);

                Console.WriteLine("selection: {0} CurrentThread.CurrentCulture.Name: {1} CurrentThread.CurrentUICulture.Name: {2}  Value: {3}",
                    culture ?? "ambient",
                    System.Threading.Thread.CurrentThread.CurrentCulture.Name,
                    System.Threading.Thread.CurrentThread.CurrentUICulture.Name,
                    dt.ToString("hhh:mm tt"));
            }
    }
}

Вывод в предыдущих версиях окон:

selection: ambient CurrentThread.CurrentCulture.Name: en-NZ CurrentThread.CurrentUICulture.Name: en-NZ Value: 03:04 a.m.
selection: en-NZ CurrentThread.CurrentCulture.Name: en-NZ CurrentThread.CurrentUICulture.Name: en-NZ Value: 03:04 a.m.
selection: en-US CurrentThread.CurrentCulture.Name: en-US CurrentThread.CurrentUICulture.Name: en-US Value: 03:04 AM
selection: en-AU CurrentThread.CurrentCulture.Name: en-AU CurrentThread.CurrentUICulture.Name: en-AU Value: 03:04 AM
selection: en-GB CurrentThread.CurrentCulture.Name: en-GB CurrentThread.CurrentUICulture.Name: en-GB Value: 03:04 am

И в окнах 10:

selection: ambient (windows 10) CurrentThread.CurrentCulture.Name: en-NZ CurrentThread.CurrentUICulture.Name: en-US  Value: 03:04 a.m.
selection: en-NZ CurrentThread.CurrentCulture.Name: en-NZ CurrentThread.CurrentUICulture.Name: en-NZ  Value: 03:04 AM
selection: en-US CurrentThread.CurrentCulture.Name: en-US CurrentThread.CurrentUICulture.Name: en-US  Value: 03:04 AM
selection: en-AU CurrentThread.CurrentCulture.Name: en-AU CurrentThread.CurrentUICulture.Name: en-AU  Value: 03:04 AM
selection: en-GB CurrentThread.CurrentCulture.Name: en-GB CurrentThread.CurrentUICulture.Name: en-GB  Value: 03:04 AM

В обоих случаях этот код был скомпилирован, чтобы нацелить Visual Studio 2013 на таргетинг .Net Framework 4.5

Кто-нибудь знает, почему поведение изменилось - и почему в Windows 10 появляется настройка какой-либо культуры в потоке, конкретно изменяет вывод AM/PM, который будет отформатирован как "AM" / "PM", а не то, что обычно выводится для эта культура?

4b9b3361

Ответ 1

Возможно, вы захотите взглянуть на "Данные о культуре не должны считаться стабильными" http://blogs.msdn.com/b/shawnste/archive/2005/04/05/405694.aspx

Один бит заключается в том, что мы начали использовать CLDR (Common Locale Data Repository, http://cldr.unicode.org) для многих локалей, чтобы лучше совместить с отраслевыми стандартами, Возможно, вы заметили, что имеется немало дополнительных локалей, для которых мы теперь имеем данные.

Ответ 2

Я всегда использую ToString("G") при изменении DateTime на строку с помощью функции ToString(). Тогда у меня нет проблем, чтобы снова проанализировать строку DateTime. Я тестировал его с помощью своего клиентского приложения (получает дату и время в формате XML в формате "G" и анализирует его на DateTime) в Windows 7/8/10.

Ответ 3

Я также обнаружил, что комбинация обновления "en-nz" и Windows 10 внезапно меняет a.m./p.m. на AM/PM.

Разница заключается в том, что код, который я поддерживал, ретранслировал на выходе ToShortTimeString() с a.m./p.m., но в Windows 10 он менялся на AM/PM, вместо этого я провожу время, пытаясь найти правильную строку информации о культуре/формате, и я также пытаюсь найти отсутствующую локальную настройку на моем новом компьютере с Windows 10 по сравнению с моей старой машиной Windows 7. Но оказывается, что одна и та же локальная настройка на другой версии Windows-машины действительно отличается от a.m./p.m. AM/PM.

Настройка на моем компьютере с Windows 10 И символ AM изменился на AM сейчас Настройка на компьютере с Windows 7 в сравнении И символ AM есть для одного и того же языка отображения Windows И тот же параметр в Windows 2012 в сравнении, который подтверждает, что пока только окна 10 отличаются

Также подтвердите, что DateTimeFormatInfo.AMDesignator для 'en-nz' теперь выводит 'AM' вместо 'a.m.'