DateTime.TryParse () и DateTime.TryParseExact () не анализируют дату на linux / macos и работают правильно на windows - PullRequest
3 голосов
/ 13 января 2020

Я пытаюсь разобрать дату в формате "Вс, 1 дек 2019 20:40:00 +0300" (русский язык), сделать tnet core 3.1, а TryParse () и TryParseExact () работают правильно на windows но не на linux и макос. Я пробовал разные форматы и разные DateTimeStyles, текущую культуру и использовал System.Globalization.CultureInfo.GetCultureInfo ("ru-RU") для получения объекта культуры русского языка. Пробовал на Ubuntu на нескольких машинах - дата не разбирается. Это код, который я использую с некоторыми форматами:

string dateStr = "Вс, 1 дек 2019 20:40:00 +0300";
        string dateStr2 = "Вс, 1 дек 2019 20:50:00";
        DateTime result = default(DateTime);
        DateTime result2 = default(DateTime);
        string[] dateFormats = new string[]{
            "ddd, d MMM yyyy HH:mm:ss",
            "ddd, d MMM yyyy HH:mm:ss K",
            "ddd, d MMM yyyy H:mm:ss",
            "ddd, d MMM yyyy H:mm:ss K"
        };
        var ruRu = System.Globalization.CultureInfo.GetCultureInfo("ru-RU"); 

        if(!DateTime.TryParse(dateStr, ruRu, DateTimeStyles.None, out result)){
            DateTime.TryParseExact(dateStr, dateFormats,
            //System.Globalization.CultureInfo.CurrentCulture,
            ruRu,
            System.Globalization.DateTimeStyles.AssumeUniversal, out result);
        }

        if (!DateTime.TryParse(dateStr2, ruRu, DateTimeStyles.None, out result2)){
            DateTime.TryParseExact(dateStr2, dateFormats,
            //System.Globalization.CultureInfo.CurrentCulture,
            ruRu,
            System.Globalization.DateTimeStyles.AssumeUniversal, out result2);
        }

        Console.WriteLine(result);
        Console.WriteLine(result2);

В обоих случаях под linux и macos я получил '1/1/0001 12:00:00 AM'

Ответы [ 2 ]

1 голос
/ 13 января 2020

хорошо, кажется, что Linux. Net В Core 2.2 определены разные названия месяцев по сравнению с Windows:

TestContext.WriteLine("month:{0}", string.Join(";", ruRu.DateTimeFormat.AbbreviatedMonthNames));

: month:янв;фев;мар;апр;май;июн;июл;авг;сен;окт;ноя;дек; на Windows

, но month:янв.;февр.;март;апр.;май;июнь;июль;авг.;сент.;окт.;нояб.;дек.; в Ubuntu (не спрашивайте меня, почему). Точка добавляется в конце месяца сокращений.

Также необходимо учитывать, что июнь;июль;март не укорочены и февр не похож на Windows фев

Ma c ОС построена на некоторых * Ядро 1038 * на самом деле, поэтому оно имеет ту же структуру. net, что и в Ubuntu.

Ваш случай может быть решен с помощью строки нового формата, как показано ниже:

string[] dateFormats = new string[]{
"ddd, d MMM yyyy HH:mm:ss",
"ddd, d MMM yyyy HH:mm:ss K",
"ddd, d MMM. yyyy HH:mm:ss K", // this is added for linux 
"ddd, d MMM yyyy H:mm:ss",
"ddd, d MMM yyyy H:mm:ss K"
};

Однако выглядит как ошибка в. net, так как, например, не будет анализировать март месяц с Пн, 4 мар 2019 00:00:00.

UPD: я проверил и не нашел способа разбирать Пн, 4 мар 2019 00:00:00 на Linux использование DateTime.TryParseExact из-за март на Linux не будет проанализировано с мар

Кажется, что вы должны зарегистрировать новую проблему для. Net Core. Или разобрать строку вручную, но она отстой

0 голосов
/ 13 января 2020

Код ниже работает:

            string[] dateStrs = {"Вс, 1 дек 2019 20:40:00 +0300","Вс, 1 дек 2019 20:50:00"};
            var ruRu = System.Globalization.CultureInfo.GetCultureInfo("ru-RU");
            string[] dateFormats = new string[]{
                "ddd, d MMM yyyy HH:mm:ss",
                "ddd, d MMM yyyy HH:mm:ss K",
                "ddd, d MMM yyyy H:mm:ss",
                "ddd, d MMM yyyy H:mm:ss K"
            };
            DateTime date;
            Boolean match = false;
            foreach (string dateStr in dateStrs)
            {
                match = DateTime.TryParseExact(dateStr,dateFormats, ruRu, System.Globalization.DateTimeStyles.None, out date);
                Console.WriteLine(date.ToString());

            }
            Console.ReadLine();
...