Вывод времени (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", а не то, что обычно выводится для эта культура?
Ответы
Ответ 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 2012 в сравнении, который подтверждает, что пока только окна 10 отличаются]()
Также подтвердите, что DateTimeFormatInfo.AMDesignator для 'en-nz' теперь выводит 'AM' вместо 'a.m.'