[英]C# Parse DateTime using DateTime.TryParseExact() multiple format
[英]Failing to parse date in yyyyMMdd Hmm format using DateTime.TryParseExact()
我正在以“ 20170317 630”之类的格式获取约会时间,这意味着2017年3月17日上午6:30
这是我正在尝试的代码块,但失败了。
var str = "20170317 0630";
var formatedTime = "yyyyMMdd Hmm";
DateTime etaDate;
if (!DateTime.TryParseExact(str,formatedTime, CultureInfo.InvariantCulture, DateTimeStyles.None, out etaDate)) //formatedTime, CultureInfo.InvariantCulture, DateTimeStyles.None
{
Console.WriteLine("Date conversion failed " + etaDate);
}
Console.WriteLine("Date conversion passed "+etaDate);
通过:20170317 0630
失败于:20170317 630
请帮我解决一下这个。
我没有完全感到惊讶的是它未能解析-我怀疑它是在贪婪地解析“ 63”并将其视为无效的小时数。
在Noda Time中,我们有完全相同的问题 -我无意修复。 使这项工作将是一个巨大的努力量,很可能减少对更为明智格式的效果。
我强烈建议您改用更明智的格式,例如
H:mm
消除伪歧义 HHmm
,让一切变得更清晰 HH:mm
甚至更好-最好在日期部分加上连字符,因此yyyy-MM-dd HH:mm
您只需检测字符串的长度即可将其从一种格式转换为另一种格式,因为字符串的其他每个部分都是固定长度。 例如,仅使用HHmm
您可以执行以下操作:
if (str.Length == "yyyyMMdd Hmm".Length)
{
str = str.Insert("yyyyMMdd ".Length, "0");
}
然后使用yyyyMMdd HHmm
格式进行解析。 如果长度对于任一有效宽度都不正确,那么以后无论如何都将无法解析。
//split str in to strDate and strTime by using space
var strDate = "20170317"; //Date part
var strTime ="630"; //Time part
if(strTime.Length ==3) //check lenght of time part
{
strTime = "0" + strTime; //Add extra zero
}
var formatedTime = "yyyyMMdd HHmm";
DateTime etaDate;
if (!DateTime.TryParseExact(strDate + strTime,formatedTime, CultureInfo.InvariantCulture, DateTimeStyles.None, out etaDate)) //formatedTime, CultureInfo.InvariantCulture, DateTimeStyles.None
{
Console.WriteLine("Date conversion failed " + etaDate);
}
Console.WriteLine("Date conversion passed "+etaDate);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.