簡體   English   中英

DateTime.TryParse() 和 DateTime.TryParseExact() 不會在 linux/macos 上解析日期並在 Windows 上正常工作

[英]DateTime.TryParse() and DateTime.TryParseExact() doesn't parse date on linux/macos and work properly on windows

我嘗試解析格式為“Вс, 1 дек 2019 20:40:00 +0300”(俄語)dotnet 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”

好吧,與 Windows 相比,Linux .Net Core 2.2 似乎定義了不同的月份名稱:

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

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

month:янв.;февр.;март;апр.;май;июнь;июль;авг.;сент.;окт.;нояб.;дек.; 在 Ubuntu 上(不要問我為什么)。 在月份縮寫的末尾添加點。

此外,您還必須考慮到июнь;июль;март沒有縮短,並且февр不像 Windows 上的фев

Mac OS 實際上是建立在一些 Unix 內核上的,所以我想它具有與 Ubuntu 相同的 .net 框架。

您的情況可以使用新的格式字符串解決,如下所示:

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:我已經檢查並沒有找到在 Linux 上使用DateTime.TryParseExact解析Пн, 4 мар 2019 00:00:00方法,因為 Linux 上的март不會從мар解析

似乎您應該為 .Net Core 注冊新問題。 或者手動解析字符串但它很糟糕

下面的代碼有效:

            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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM