DateTime ToString没有正确格式化ddMMy指定符
本文关键字:ddMMy 格式化 ToString DateTime | 更新日期: 2023-09-27 18:07:02
我的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
实现中的错误?
您似乎误解了格式说明符的加倍。
y
不只输出年份的最后一位数字。它为2009
输出9
,为2016
输出16
,而yy
为2009
输出09
,为2016
输出16
。对于其他格式指定也是如此。
示例:考虑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
是完全正确的。如果它是2016,那么前面的格式化将输出16
。字符串中的年份部分仅由6
组成,并且您没有"强制"前导零,这导致算法将单个6
视为2006
。到目前为止一切都很好。
This:即使你使用我上面的例子将2016格式化为6
,解析将始终生成2006
而不是2016
。
短:如果你想要2016,一定要把16
放在你的字符串中,而不仅仅是6
。