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实现中的错误?

DateTime ToString没有正确格式化ddMMy指定符

您似乎误解了格式说明符的加倍。

y不只输出年份的最后一位数字。它为2009输出9,为2016输出16,而yy2009输出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