解析中文 DateTime

Parse Chinese DateTime

提问人:Bart 提问时间:5/17/2023 最后编辑:StevenBart 更新时间:5/17/2023 访问量:131

问:

我正在尝试将以下字符串转换为 DateTimeOffset

二 5月 16 14:41:40 +0800 2023

翻译为“Tue May 16 14:41:40 +0800 2023”

我尝试了以下代码:

DateTimeOffset.Parse(lastLogin, new CultureInfo("zh-CN"), DateTimeStyles.None)

但不幸的是没有成功。

我还尝试了以下格式:和 .也没有成功。ParseExact()ddd MMM d HH:mm:ss zzz yyyyd MMM d HH:mm:ss zzz yyyy

System.FormatException:“字符串'二 5月 16 14:43:10 +0800 2023'未被识别为有效的 DateTime。有一个未知的单词从索引“0”开始。

C# .NET 时间日期 分析

评论


答:

1赞 Joel Coehoorn 5/17/2023 #1

谷歌翻译说,第一个字形只是“”,而不是星期二,没有一周中的某一天的暗示。如果我进一步从英语开始并翻译成中文,星期二看起来像这样: .two周二

如果我随后采用新字形并将其用作输入的一部分,则解析成功。

因此,我建议您的输入字符串以某种方式缺少一个字符。

评论

0赞 Bart 5/17/2023
谢谢你的快速回答乔尔。此字符串来自中国 Ubuntu Linux 服务器上的“lastlog”命令。因此,可能是 DateTime 在 Linux 中的格式错误。我自己不会说中文,所以我不确定用中文写日期的正确方式是什么。
0赞 Joel Coehoorn 5/17/2023
@Bart 由于星期几是多余的(由日/月/年暗示),并且您正在解析日期格式应一致的日志文件,因此我建议在调用或Parse()ParseExact()
3赞 SynerCoder 5/17/2023 #2

默认的 zh-CN 区域性具有以下数组的缩写日期名称:

"周日", "周一", "周二", "周三", "周四", "周五", "周六"

因此,您可以创建自己的对象,可用于解析字符串。您可以使用 zh-CN 区域性作为起点:DateTimeFormatInfo

using System.Globalization;

var zhcnCulture = CultureInfo.GetCultureInfo("zh-CN");
var writeableClone = (DateTimeFormatInfo)zhcnCulture.DateTimeFormat.Clone();
writeableClone.AbbreviatedDayNames = new string[] { "日", "一", "二", "三", "四", "五", "六" };
// or use:
// writeableClone.AbbreviatedDayNames = writeableClone.ShortestDayNames;

var dateTxt = "二 5月 16 14:41:40 +0800 2023";
var format = "ddd M月 d HH:mm:ss zzz yyyy";
var parsedDate = DateTimeOffset.ParseExact(dateTxt, format, writeableClone);

您需要克隆起点,因为起点是一个只读对象,如果您尝试更改它,它将给出错误。