Почему DateTimeFormatInfo.GetAllDateTimePatterns возвращает разные результаты в разных версиях .NET?

Я выполняю некоторую работу по глобализации в своем текущем проекте, и я столкнулся с любопытным поведением. Я работаю в Windows 7 с установленным только англо-американским языком, а мое приложение работает на .NET 3.5.

Учитывая следующий фрагмент:

var culture = new CultureInfo("zh-CN", true);
var formats = culture.GetAllDateTimePatterns('D');

В .NET 4 возвращаются следующие форматы:

    yyyy'年'M'月'd'日'
    yyyy'年'M'月'd'日',dddd 
    dddd,yyyy'年'M'月'd'日'

Это то, что показывает диалоговое окно «Форматы даты и времени» на панели управления (к чему я стремился).

Но в .NET 3.5 (и более ранних версиях) возвращается следующее:

   yyyy'年'M'月'd'日'
   yyyy-MM-dd
   dddd, yyyy-MM-dd
   dddd, yyyy'年'M'月'd'日'

Я пошел и проверил, какие значения были возвращены, используя EnumDateFormatsExEx (и более ранние версии), и он совпал с результатами .NET 4.

Разница меня не беспокоит; мой вопрос: почему результаты отличаются? Я предположил, что базовая реализация вызывает EnumDateFormatsExEx или что-то подобное, но после того, как я запустил Ilspy, я не увидел ничего подобного. Я хотел показать тот же список, что и в Панели управления, поэтому был удивлен, когда форматы оказались другими. Я полагал, что список форматов будет исходить от ОС и не будет отличаться между версиями во время выполнения.


person ComradeCow    schedule 08.02.2012    source источник


Ответы (1)


Соответствующие изменения в .NET 4 задокументированы здесь. Выделение:

Одной из основных функций глобализации .NET Framework 4 является возможность предоставления самой последней информации там, где она доступна. Самая старая информация о глобализации, которую предоставляет этот выпуск, — это данные, доступные на момент поставки, и только при работе в Windows до Windows 7. При работе в Windows 7 и более поздних версиях информация о глобализации будет извлекаться непосредственно из операционной системы, что означает, что клиенты получат текущую информацию о глобализации при обновлении до новой Windows. Клиенты, использующие Windows 7 и более поздние версии, увидят унифицированный интерфейс глобализации как для собственных (Win32), так и для управляемых (.NET) приложений.

Из-за постоянно меняющегося мира информация о глобализации может быть изменена в любое время; разработчики не должны ожидать, что значения свойств глобализации будут сохраняться между выпусками или даже для одного и того же выпуска .NET Framework. Это не совсем новое поведение для пользователей .NET Framework. Свойства культур только для Windows, которые поддерживались, начиная с .NET Framework 2, могли иметь разные значения при работе в разных версиях Windows.

person Hans Passant    schedule 09.02.2012