我DateTime.ToString
的格式如下:
ddMMy
但是,此格式会返回年份的两位数日期,即16
而不是6
。请参阅以下代码示例:
DateTime dt = new DateTime(2016, 9, 12);
Console.WriteLine(dt.ToString("ddMMyy"));
显示:
120916
而不是预期的:
12096
进一步使以下代码复杂化:
string date = "12096";
Console.WriteLine(DateTime.ParseExact(date, "ddMMy", System.Globalization.CultureInfo.CurrentCulture,
System.Globalization.DateTimeStyles.None).ToString("yyyyMMdd"));
产生输出:
20060912
我是否可以传递一种格式来获取13096
所需的输出,或者这是DateTime.ToString
实施中的错误?
答案 0 :(得分:7)
您似乎误解了格式说明符的加倍。
y
仅输出年份的最后一位数字。它为9
输出2009
,16
输出2016
,而yy
和09
输出2009
16
} 2016
。对于其他格式指定也是如此。
示例:考虑2005年7月1日
dMy => 175
dMyy => 1705
dMMyy => 10705
ddMMyy => 010705
一般规则是:如果您使用单个字母,则不会有前导零。如果您使用两个字母,则可能会有前导零。更多字母提供特定于日期部分的其他选项(例如,yyyy
提供全年,MMM
提供缩短的月份名称。
为了解决您的问题,我将日期格式与数学结合起来。你可以试试这个:
string date = dt.ToString("ddMM") + (dt.Year % 10).ToString();
对于您的解析问题:由于我上面所说的,您可以得出结论,将12096
解析为206-09-12
是完全正确的。如果是20 16 ,则之前的格式设置将输出16
。事实上,字符串中的年份部分仅包含6
并且您没有“强制”前导零,这会导致算法将单个6
视为2006
。到目前为止,一切都很好。
这:即使您使用上面的示例将2016格式化为6
,解析也始终会生成2006
而不是2016
。
简短:如果您想要2016,请务必将16
放入字符串中,而不仅仅是6
。