首页 > 解决方案 > 解析日期时间会给出从索引 3 开始的单词的错误

问题描述

我有字符串格式的日期时间,如下所示:

24-ago-19 19:21:14

或者这样的格式:

Aug-24-19 19:21:14 

当我在第二种格式上使用它时:

DateTime.Parse(dateTime); 

它正确解析日期时间-但是在第一种格式上:

24-ago-19 20:21:14 

我收到这样的错误:

该字符串未被识别为有效的日期时间。从索引 3 开始有一个未知单词

如何处理任何日期格式的转换 - 最好将其转换为“太平洋标准时间”?

我在这里做错了什么?有人可以帮我吗?

标签: c#datedatetimeconsoleconsole-application

解决方案


如果没有自定义字符串格式的任何字符串操作,您就无法ago同时解析两者。AugCultureInfo

让我们先运行一些代码;

foreach (var culture in CultureInfo.GetCultures(CultureTypes.AllCultures))
{
    if (culture.DateTimeFormat.MonthNames.Contains("ago") ||
        culture.DateTimeFormat.AbbreviatedMonthNames.Contains("ago"))
    {
       if (culture.DateTimeFormat.MonthNames.Contains("Aug") ||
           culture.DateTimeFormat.AbbreviatedMonthNames.Contains("Aug"))
       {
           Console.WriteLine(culture.Name);
       }
    }
}

这段代码在我的电脑上没有写任何CultureInfo名字,也可能不会在你的电脑上打印。这意味着,没有包含这些月份名称和缩写月份名称的文化信息。即使我检查了属格月份名称(包括 onAbbreviatedMonthGenitiveNamesMonthGenitiveNames属性),但没有运气。

如果您可以直接解析Aug-24-19 19:21:14字符串DateTime.Parse,这意味着您CurrentCultureAug一个缩写的月份名称和MMM-dd-yy HH:mm:ss一个标准的日期和时间格式。

如何处理任何日期格式的转换

不能。必须确切地知道字符串的格式以防止出现模棱两可的情况。例如,让我们以01-02-2019字符串为例。是1月2日还是2月1日?你甚至可以通过只看它的格式来告诉这一点吗?世界各地不同地区的不同人对这种格式的阅读方式不同。

最好将其转换为“太平洋标准时间”

成功解析字符串后(记住你的DateTime.Kind应该是Local),你可以使用TimeZoneInfo.ConvertTimeBySystemTimeZoneId方法来转换它;

var myDate = DateTime.Parse("Aug-24-19 19:21:14 "); 
var myPSTdate = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(myDate , "Pacific Standard Time");

我在这里做错了什么?

据我所知,你没有做错任何事。您的输入对于使用相同的文化信息进行解析是不可靠的。而已。有人将这种情况称为垃圾进,垃圾出。如果你修正你的输入,你的职责应该是首先修正它们的格式。


推荐阅读