Почему мой локальный компьютер неправильно форматирует международные даты? - PullRequest
0 голосов
/ 03 ноября 2018

Вот странный ...

Я только что видел (ранее проходивший) тест неудачным из-за лишних пробелов в строковом представлении даты. Этот тест ранее проходил в CI и на моей локальной машине, но сейчас не проходит (на моей локальной машине) из-за лишних пробелов между сегментами даты.

Такое же поведение проявляется в следующих MCVE:

using System;
using System.Globalization;

public class Program
{
    public static void Main()
    {
        var date = new DateTime(2018, 01, 31);
        var format = "d/M/yyyy";
        var skSK = new CultureInfo("sk-SK");
        Console.WriteLine(date.ToString(format, skSK));
    }
}

В большинстве мест (включая .NET Fiddle ) это правильно возвращает:

31.1.2018

Но на моей машине я теперь получаю:

31. 1. 2018

Обратите внимание на лишние пробелы!

Я уверен, что это работало, как и ожидалось, на моем локальном ПК чуть ранее на этой неделе, так как я использовал проект с этим тестом в качестве отправной точки для некоторых экспериментов с инструментами покрытия. Когда я возобновил эти эксперименты сегодня днем, файл покрытия больше не создается из-за недавно провалившегося теста.

Что могло измениться на моем компьютере, чтобы вызвать такое нарушение?

Ответы [ 2 ]

0 голосов
/ 04 ноября 2018

В Windows (как и во многих других системах) источником форматов даты и времени локали является Репозиторий общих локалей Unicode (CLDR) , который обеспечивает поддержку интернационализации и локализации, характерную для разработчиков программного обеспечения и лингвистов. .
Краткий список значимых пользователей :

  • Microsoft (Windows, Office, Visual Studio и т. Д.)
  • Apple (macOS, iOS, watchOS, tvOS, поддержка мобильных устройств Apple и iTunes для Windows;
  • Google (веб-поиск, Chrome, Android, Adwords, Google+, Google Maps, Blogger, Google Analytics)
  • IBM (DB2, Lotus, Websphere, Tivoli, Rational, AIX, i / OS, z / OS)
  • Amazon

См. Онлайн-браузер данных локализаций: Locale Explorer .

Формат короткой даты, локализованный для культуры sk-SK как d. M. yyyy, указан в этом архиве. Это одинаково для всех ОС (от Windows 7 до Window 10).

Блог разработчика MS: Locale Builder и финский или другие языки.

Fiddler или другие онлайн-сервисы для работы с кодами не являются источником сравнения по этому вопросу.
Локали отличаются в зависимости от системы. Кроме того, эти международные форматы со временем меняются и зависят от обновлений, которые получает система (если она вообще получает эти обновления).

В Windows 7 и Windows 10 формат краткой даты по умолчанию для sk-SK Культура: d. M. yyyy.
Но шаблоны DateTime не совпадают, если список форматов анализируется дальше.

string format = CultureInfo.CreateSpecificCulture("sk-SK")
                           .DateTimeFormat.GetAllDateTimePatterns()[1]; 

В Windows 7 вторым элементом в списке DateTimePatterns является d.M.yyyy
В Windows 10 элемент с таким же индексом: dddd d. MMMM yyyy

Обновление Windows может изменить шаблон по умолчанию для любой локали (без явного уведомления).
Понятно, что приложения должны предоставлять средства анализа для особых случаев. Или обратитесь к пользовательским настройкам языкового стандарта при форматировании, не пытаясь принудительно задать определенный шаблон для внутреннего использования.
Форматы даты / времени следует использовать только для презентации. Язык и пользовательские настройки определяют этот формат. Пользователь Системы может решить использовать другой формат, отличный от языкового стандарта по умолчанию.

Этот репозиторий GitHub содержит обновленный JSON базы данных CLDR:
CLDR Дата Модерн

Также интересно, ссылка на ECMAScript для интернационализации API:
Спецификация API интернационализации ECMAScript® 2017

Последние рекомендации MSDN по глобализации и локализации (связанные с UWP):
Глобализация и локализация
Глобализация форматов даты / времени / чисел
Используйте многоязычный инструментарий приложения 4.0

0 голосов
/ 03 ноября 2018

У меня была такая же проблема на моей машине с Windows 10, я получил "31. 1. 208". Но используя:

var format = "d.M.yyyy";

производит: 31.1.2018

кажется, что-то с CultureInfo ("sk-SK") :

Console.WriteLine(date.ToString("d", new CultureInfo("de-DE")));

производит: 31.01.2018

и

Console.WriteLine(date.ToString("d/M/yyyy", new CultureInfo("de-DE")));

производит: 31.1.2018

(в Панели управления Windows - Регион, мой установлен как «Английский - Канада» и короткая дата: «дд / мм / гггг».

Кажется, это определено в .Net Framework - посмотрите пробелы там:

It seems to be defined in the .Net Framework - see the spaces there

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...