[英]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.