从stringC#DateTime转换
我有一个格式为Mdyyyy
的string( 642014
)。
我想将string转换为04062014
( ddMMYYYY
)。
我已经尝试了下面的代码。
请帮忙。
DateTime.TryParseExact("642014", "MMddyyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out "04062014");
这不是一个有效的date格式。
突出问题是1112014
1st of Nov
或1st of Nov
11th of Jan
?
如果你有某种约定允许你决定在这些情况下引用哪个date,你可以做一些预处理或者手动parsingstring,但是你不会为这种格式find任何“内置的”
你的情况看起来像另一个最广泛的forms问题。
从DateTime.TryParseExact
方法
如果您不使用自定义格式模式中的date或时间分隔符 ,请使用提供程序参数的不变文化和每个自定义格式说明符的最宽格式。 例如,如果要在模式中指定小时,请指定较宽的格式“HH”,而不是较窄的格式“H”。
因此,parsing没有任何date或时间分隔符的string有时可能是个问题。
例如让我们来谈谈"d"
自定义格式说明符 。 对于格式化部分,它使用一个数字格式化您的白天部分, 而不用前导零。 但是对于parsing,它也可以parsing4
和04
。 它与"M"
自定义格式说明符相同 。 我不是说04
你应该使用d
说明符。 你可以 ,但你不应该。 您应该始终使用适合您的string的最佳格式。
这里是我对这里发生的事情的看法。
由于最宽的forms规则,因为你的string没有任何date分隔符,所以你的格式应该是最大的d
和M
forms,他们是dd
和MM
。 但我认为这些说明符期望与一个前导零值(例如: 06
和04
)时,他们用于单个数字,因为实际上是为了什么 。 我找不到任何证据支持我的理论,但我仍在调查。
我有一个解决scheme,如果你的string总是 Mdyyyy
格式。 也许这不是最好的解决scheme,但我认为这是有用的,如果你的string有一个恒定的格式;
public static DateTime? ParseDate_Mdyyyy(string date) { if (date == null) return null; if (date.Length < 6) return null; if (date.Length == 6) date = date.Insert(0, "0").Insert(2, "0"); DateTime dt; if (DateTime.TryParseExact(date, "MMddyyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out dt)) return dt; return null; }
现在你可以使用这个方法了;
string s = "642014"; DateTime? date = ParseDate_Mdyyyy(s); Console.WriteLine(date.Value.ToString("ddMMyyyy")); // 04062014
我在这里连接到.NET Framework Team关于这个问题的回应;
嗨Soner,
parsing代码并不是真的在寻找任何分隔符。 这是发生了什么事情:
对于使用
“MMddyyyy”
,parsing将从调用ParseByFormat
的方法DoStrictParse
开始。 这个方法将获得格式的第一部分,即“MM”
,然后调用ParseDigits
从我们parsing“642014”
的string中获得等价的数字,这将得到“64”
。 请注意,直到那个时候,如果数字超出了所选日历中的月份范围(这里是我们的情况下的公历),则不会有validation发生 。 parsing代码将重复相同的过程为“dd”
,将获得等效的部分“20”
,然后将重复“yyyy”
但这失败,因为它期望4
位数,我们只有两个(“14”
)。对于使用
“Mdyyyy”
的情况,由于parsing部分“M”
原因几乎相同,所以我们知道月份可以是2
位数,所以我们将它映射为“64”
,并将与“d”
相同将其映射到“20”
,然后年将失败。 我相信这就是说明文件总是使用最广泛的forms的原因。这里的build议要么是使用string中的
2
位数字forms,如"06042014"
,parsing也应该以“MMddyyyy”
和“Mdyyyy”
成功。 其他选项是插入分隔符"6/4/2014"
或"6/4/2014"
"06/04/2014"
并parsing为"M/d/yyyy"
谢谢,Tarek
特别感谢; Tarek Mahmoud Sayed,Wes Haggard和Richard Lander。
parsing你的string,首先加斜杠到相关的位置,然后parsing它
string str = "642014"; str = str.Insert(2,"/").Insert(1,"/"); var result = DateTime.ParseExact(str, "M/d/yyyy",CultureInfo.InvariantCulture);