C# 如何将格式为MMMDYYYYHMMTT的datetime字符串转换为datetime对象?
我试过如下方法:C# 如何将格式为MMMDYYYYHMMTT的datetime字符串转换为datetime对象?,c#,datetime,C#,Datetime,我试过如下方法: DateTime.ParseExact("Feb520161000PM", "MMMdyyyyhhmmtt", CultureInfo.InvariantCulture) 但这是一个例外 有趣的是 DateTime.ParseExact(DateTime.Now.ToString("MMMdyyyyhhmmtt"), "MMMdyyyyhhmmtt", CultureInfo.InvariantCulture) 这也导致了格式异常。使用从左到右的常规解析无法解析格式-您
DateTime.ParseExact("Feb520161000PM",
"MMMdyyyyhhmmtt", CultureInfo.InvariantCulture)
但这是一个例外
有趣的是
DateTime.ParseExact(DateTime.Now.ToString("MMMdyyyyhhmmtt"), "MMMdyyyyhhmmtt",
CultureInfo.InvariantCulture)
这也导致了格式异常。使用从左到右的常规解析无法解析格式-您需要自定义代码,从右到左解析值,因为您希望最左边的数字为可变宽度FEB111111pm 如果可能-将格式更改为具有固定宽度字段的格式,最好是ISO8601。否则,手动拆分字符串并从生成的部分构造日期时间部分本身就可以正常工作,所以只需要手动解析日期部分
其他一些方法和信息可以在类似的关于时间的帖子中找到-该格式无法使用从左到右的常规解析进行解析-您需要自定义代码从右到左解析值,因为您希望最左边的数字是可变宽度的feb111111pm 如果可能-将格式更改为具有固定宽度字段的格式,最好是ISO8601。否则,手动拆分字符串并从生成的部分构造日期时间部分本身就可以正常工作,所以只需要手动解析日期部分 其他一些方法和信息可以在类似的关于时间的帖子中找到-是非常正确的,如果你允许的话,我想深入解释一下 您认为5应该与d说明符匹配,对吗?但DateTime.ParseExact不是这样工作的 因为表示从1到31的数字,所以这个说明符将映射字符串中的52,而不仅仅是5。这就是代码引发FormatException的原因 如您所见,您的字符串格式无法解析,除非您使用它进行一些字符串操作 在这种情况下,.NET团队要么使用两位数的表单,如05,要么为日期和时间值插入分隔符 您可以创建一个自定义方法来解析此mmmdyyyhhmmtt格式,以便仅解析此类格式化字符串,如
public static DateTime? ParseDate_MMMdyyyyhhmmtt(string date)
{
if (date == null)
return null;
if (date.Length < 14)
return null;
if (date.Length == 14)
date = date.Insert(3, "0");
DateTime dt;
if (DateTime.TryParseExact(date, "MMMdyyyyhhmmtt",
CultureInfo.InvariantCulture,
DateTimeStyles.None, out dt))
return dt;
return null;
}
是的,如果你允许我的话,我想深入解释一下
您认为5应该与d说明符匹配,对吗?但DateTime.ParseExact不是这样工作的
因为表示从1到31的数字,所以这个说明符将映射字符串中的52,而不仅仅是5。这就是代码引发FormatException的原因
如您所见,您的字符串格式无法解析,除非您使用它进行一些字符串操作
在这种情况下,.NET团队要么使用两位数的表单,如05,要么为日期和时间值插入分隔符
您可以创建一个自定义方法来解析此mmmdyyyhhmmtt格式,以便仅解析此类格式化字符串,如
public static DateTime? ParseDate_MMMdyyyyhhmmtt(string date)
{
if (date == null)
return null;
if (date.Length < 14)
return null;
if (date.Length == 14)
date = date.Insert(3, "0");
DateTime dt;
if (DateTime.TryParseExact(date, "MMMdyyyyhhmmtt",
CultureInfo.InvariantCulture,
DateTimeStyles.None, out dt))
return dt;
return null;
}
当你说最左边的数字是可变宽度时,你的意思是,值可以是Feb5和Feb25吗?@Shyju是-对于Feb1201510。。。从左向右扫描时,解析必须确定是2015年2月1日还是2015年2月12日。显然,我想2015年2月1日还不能在没有写代码的情况下表达给计算机谢谢!这就解释了。我想你应该把它添加到未来读者的答案中。Feb0520161000PM和mmmddyyyyyhhmmtt将起作用。另外,2011年2月5日下午6点1分和MMM-d-yyyyyhhmmttwo正在寻找要回答的问题,你刚刚教了我一些关于解析日期的非常酷的东西,谢谢@AlexeiLevenkov。以前从未遇到过这种从右到左的情况。当你说最左边的数字是可变宽度时,你的意思是,值可以是Feb5和Feb25吗?@Shyju yes-对于Feb1201510。。。从左向右扫描时,解析必须确定是2015年2月1日还是2015年2月12日。显然,我想2015年2月1日还不能在没有写代码的情况下表达给计算机谢谢!这就解释了。我想你应该把它添加到未来读者的答案中。Feb0520161000PM和mmmddyyyyyhhmmtt将起作用。另外,2011年2月5日下午6点1分和MMM-d-yyyyyhhmmttwo正在寻找要回答的问题,你刚刚教了我一些关于解析日期的非常酷的东西,谢谢@AlexeiLevenkov。以前从未遇到过这种从右到左的情况。我在这里看到的第一个问题是今天。您想如何用两位数仅用MMMdyyyy表示一天?顺便说一下,您的第二个代码示例在一个月的第10天之后不会抛出异常,因为d将完美地映射两位数的日数。@SonerGönül,没错,但解决方案应该适用于所有的日值。如果它对任何值都失败,那么根据me@Satyajit正如我们所说,对于全天值没有解决方案。你有点必须只对你的情况使用自定义方法。我建议你一开始不要像阿列克谢提到的那样使用这种字符串。我在这里看到的第一个问题是这一天。您想如何用两位数仅用MMMdyyyy表示一天?顺便说一下,您的第二个代码示例在一个月的第10天之后不会抛出异常,因为d将完美地映射两位数的日数。@SonerGönül,没错,但解决方案应该适用于所有的日值。如果它对任何值都失败,那么它不是一个完整的解决方案
sme@Satyajit正如我们所说,对于全天值没有解决方案。你有点必须只对你的情况使用自定义方法。我建议你不要像阿列克谢提到的那样,一开始就买这种绳子。谢谢。你在回答中解释得很好。我还创建了自己的自定义方法,以便以后对其进行解析。我在寻找是否有任何直接的库方法或工作在那里,而不是自定义方法。另外,c不应该在知道这种情况的情况下处理它,即如果它失败或类似的情况,从右向左解析。你觉得怎么样?@Satyajit我不认为会有图书馆或其他东西来做这个。一开始,您的自定义数据不正确。在这种情况下,DateTime解析方法不适合计算第5天或第52天。例如如果你的5变为1呢?1和12都是有效的日数。哪一个应该/将被解析为天?这对于任何方法和人类来说都是相当复杂的。谢谢。你在回答中解释得很好。我还创建了自己的自定义方法,以便以后对其进行解析。我在寻找是否有任何直接的库方法或工作在那里,而不是自定义方法。另外,c不应该在知道这种情况的情况下处理它,即如果它失败或类似的情况,从右向左解析。你觉得怎么样?@Satyajit我不认为会有图书馆或其他东西来做这个。一开始,您的自定义数据不正确。在这种情况下,DateTime解析方法不适合计算第5天或第52天。例如如果你的5变为1呢?1和12都是有效的日数。哪一个应该/将被解析为天?这对于任何方法和任何人来说都是相当复杂的。