解析中文日期时间

3

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

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

这段代码的含义是“2023年5月16日星期二14:41:40 +0800”

我尝试了以下代码:

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'处有一个未知单词。”

2个回答

3

默认的zh-CN文化中,缩写的星期几名称为以下数组:

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

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

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

你需要克隆起始点,因为起始点是只读对象,如果你试图更改它,会出现错误。


1

Google翻译说第一个字形只是"two",没有星期几的提示。如果我从英语开始再翻译成中文,星期二看起来像这样:周二

然后,如果我将新的字形作为输入的一部分,解析成功。

因此,我建议您的输入字符串某些字符可能丢失了。


感谢您的快速回复,Joel。这个字符串来自于一台中文Ubuntu Linux服务器上的'lastlog'命令。因此,在Linux中DateTime的格式可能被错误地格式化了。我本人不会说中文,所以我不确定在中文中编写日期的正确方式是什么。 - Bart
@Bart 自从星期几是多余的(由日/月/年暗示),而且您正在解析日期格式应保持一致的日志文件,我建议在调用Parse()ParseExact()之前始终预修剪第一个元素。 - Joel Coehoorn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接