Разбор испанской даты в C # работает по-разному на рабочем столе и сервере - PullRequest
0 голосов
/ 29 июня 2018

При попытке разобрать дату с культурой es-ES Локальное поведение у меня отличается, чем при запуске одного и того же кода на сервере сборки и при использовании dotnetfiddle.

Моя тестовая программа, которая выдвигает на первый план эту проблему, выглядит следующим образом:

public static void Main(string[] args)
{
    var when = new DateTime(2018, 01, 19);

    CultureInfo dateCulture = new CultureInfo("es-ES");
    var headerDate = "19-ene-2018";

    bool success;
    DateTime result;

    Console.WriteLine(when.ToString("dd-MMM-yyyy", dateCulture));

    success = DateTime.TryParseExact(
            headerDate,
            "dd-MMM-yyyy",
            dateCulture,
            DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal,
            out result);

    Console.WriteLine(success);
    Console.WriteLine(result);
}

В местном масштабе это производит:

19-ene-2018
True
1/19/2018 12:00:00 AM

В то время как на dotnetfiddle выдает:

19-ene.-2018
False
1/1/0001 12:00:00 AM

Первое удивительное, что при использовании точно такого же формата даты сервер форматирует месяц как ene., где локально это ene (обратите внимание на дополнительный период). Это то, что я считаю причиной фактической даты, чтобы не анализировать.

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

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

Не уверен, почему этот дополнительный период создается именно в dotnetfiddle. Но использование CultureInfo с традиционным порядком сортировки отлично работает как на локальном, так и на dotnetfiddle (также упоминается Dirk ; es-ES_tradnl) :

CultureInfo dateCulture = new CultureInfo(0x040A);
0 голосов
/ 29 июня 2018

Хотя я не могу объяснить, почему культура «es-ES» может иметь различную AbbreviatedMonthNames. Вот решение этого вопроса:

В зависимости от того, ожидается ли период или нет, вы можете изменить AbbreviatedMonthNames следующим образом:

CultureInfo dateCulture = new CultureInfo("es-ES");
dateCulture.DateTimeFormat.AbbreviatedMonthNames = dateCulture.DateTimeFormat.AbbreviatedMonthNames
    // uncomment one of the two lines below
    //.Select(x => x.TrimEnd('.'))
    //.Select(x => !string.IsNullOrEmpty(x) && x.EndsWith(".") ? x : x + ".")
    .ToArray();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...