DateTime ToString没有使用ddMMy说明符正确格式化

时间:2016-09-14 11:31:31

标签: c# datetime

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

1 个答案:

答案 0 :(得分:7)

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

y仅输出年份的最后一位数字。它为9输出200916输出2016,而yy09输出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