C# DateTime TryParseExact和填充

C# DateTime TryParseExact和填充,c#,.net,datetime,C#,.net,Datetime,我正在调用TryParse,调用的字符串要解析为DateTime。简单的东西。当格式如我所期望的那样时,这一切都会起作用。但是,当日期的每个组件/某些组件都是单个数字时,解析就会失败 例如: var dateFormat = "yyyy-dd-MM hh:mm:ss"; var dateString = "2006-4-1 2:3:5"; DateTime.TryParseExact(dateString, dateFormat, Culture

我正在调用
TryParse
,调用的字符串要解析为
DateTime
。简单的东西。当格式如我所期望的那样时,这一切都会起作用。但是,当日期的每个组件/某些组件都是单个数字时,解析就会失败

例如:

var dateFormat = "yyyy-dd-MM hh:mm:ss";
var dateString = "2006-4-1 2:3:5";

DateTime.TryParseExact(dateString, dateFormat, 
                       CultureInfo.InvariantCulture, DateTimeStyles.None, out result)
如果我将我的
日期字符串
更改为
“2006-04-01 02:03:05”
,它的解析效果很好

问题 如何告诉解析器将
2
解释为
02
,以便成功解析上述内容

我尝试过的 手动填充日期时间的每个部分,以确保其符合格式。这很管用,但感觉不太优雅。这是唯一的办法吗

我也尝试过使用像
m
这样的格式,而不是
mm

直接使用

 // please note single letters (d, M, h, m, s) whenever you allow single digits
 var dateFormat = "yyyy-d-M h:m:s";
你会得到它:

var dateString = "2006-4-1 2:3:5";

DateTime.TryParseExact(dateString, dateFormat, 
                       CultureInfo.InvariantCulture, DateTimeStyles.None, out result)

使用正则表达式:

int[] n = new Regex("[^0-9]+").Split("2006-4-1 2:3:5").Select(int.Parse).ToArray();
var datetime = new DateTime(n[0], n[1], n[2], n[3], n[4], n[5]);

为什么不使用TryParse而不是TryParseExact?根据msdn(),您的日期格式必须与您的日期字符串完全匹配,才能使TryParseExact正常工作,因此这是预期行为。@auburg-这是一个公平的评论,但我认为
TryParseExact
是为日期提供建议格式的一种方式。我不想让它变得模棱两可。例如,根据环境的不同,月份和天数可以互换。谢谢您的回复。但当“2”变成“10”时会发生什么?这将在第2小时正常工作,但在第10小时失败?@JᴀʏMᴇᴇ: 没问题:单字母允许使用单位数数字(以及两位数:
1
01
22
等)。它可能允许过多输入,如
“2016年?4个月?1和2*2=4”
-从技术上讲,字符串包含6个数字,但不是有效日期。从个人角度看,我不喜欢使用带有日期时间解析操作的正则表达式,也不喜欢生成它们的值。因为除了数字以外,字符串可能会生成日期名称、月份名称或AM/PM指示符等。。