c# - 解析日期时间会给出从索引 3 开始的单词的错误
问题描述
我有字符串格式的日期时间,如下所示:
24-ago-19 19:21:14
或者这样的格式:
Aug-24-19 19:21:14
当我在第二种格式上使用它时:
DateTime.Parse(dateTime);
它正确解析日期时间-但是在第一种格式上:
24-ago-19 20:21:14
我收到这样的错误:
该字符串未被识别为有效的日期时间。从索引 3 开始有一个未知单词
如何处理任何日期格式的转换 - 最好将其转换为“太平洋标准时间”?
我在这里做错了什么?有人可以帮我吗?
解决方案
如果没有自定义字符串格式的任何字符串操作,您就无法ago
同时解析两者。Aug
CultureInfo
让我们先运行一些代码;
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
名字,也可能不会在你的电脑上打印。这意味着,没有包含这些月份名称和缩写月份名称的文化信息。即使我检查了属格月份名称(包括 onAbbreviatedMonthGenitiveNames
和MonthGenitiveNames
属性),但没有运气。
如果您可以直接解析Aug-24-19 19:21:14
字符串DateTime.Parse
,这意味着您CurrentCulture
有Aug
一个缩写的月份名称和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");
我在这里做错了什么?
据我所知,你没有做错任何事。您的输入对于使用相同的文化信息进行解析是不可靠的。而已。有人将这种情况称为垃圾进,垃圾出。如果你能修正你的输入,你的职责应该是首先修正它们的格式。
推荐阅读
- html - 为什么负边距设置为屏幕阅读器的视觉隐藏文本?
- javascript - 嵌套数组和对象的角度管道 | 递归管道
- here-api - initMap 错误:无法创建 WebGL 上下文
- wpf - 带有 HierarchicalDataTemplate 的 WPF 树视图仅显示 1 项
- javascript - 用 jquery each() 函数替换 javascript 不起作用
- mips - 在不使用 syscall 10 的情况下终止 mips 程序(最后需要在 $v0 中存储其他内容)
- prometheus - 如何将标签值提取到 Grafana 中的变量?
- java - 如何在 Nodejs 上解密 Java AES
- erlang - Erlang Cowboy,牛仔缓存页面吗?
- ruby-on-rails - 将 vscode 中的调试配置为 Ruby on Rails 和 Docker