C#DateTime奇怪的行为

C#DateTime奇怪的行为,c#,datetime,C#,Datetime,以下程序的输出如下所示: for (int i = 0; i < 100; i++) { string year = i.ToString(); year = year.PadLeft(2, '0'); year = year + "0101"; DateTime pt = DateTime.ParseExact(year, "yyMMdd", null); Console.WriteLine("{0}. {1}",

以下程序的输出如下所示:

 for (int i = 0; i < 100; i++)
 {
       string year = i.ToString();
       year = year.PadLeft(2, '0');
       year = year + "0101";
       DateTime pt = DateTime.ParseExact(year, "yyMMdd", null);
       Console.WriteLine("{0}. {1}", i, pt.ToShortDateString());
 }

Output:
0. 1/01/2000
1. 1/01/2001
2. 1/01/2002
3. 1/01/2003
4. 1/01/2004
5. 1/01/2005
6. 1/01/2006
7. 1/01/2007
8. 1/01/2008
9. 1/01/2009
10. 1/01/2010
11. 1/01/2011
12. 1/01/2012
13. 1/01/2013
14. 1/01/2014
15. 1/01/2015
16. 1/01/2016
17. 1/01/2017
18. 1/01/2018
19. 1/01/2019
20. 1/01/2020
21. 1/01/2021
22. 1/01/2022
23. 1/01/2023
24. 1/01/2024
25. 1/01/2025
26. 1/01/2026
27. 1/01/2027
28. 1/01/2028
29. 1/01/2029
30. 1/01/1930 (Strange behavior starts from here)
31. 1/01/1931
32. 1/01/1932
33. 1/01/1933
34. 1/01/1934
35. 1/01/1935
36. 1/01/1936
37. 1/01/1937
38. 1/01/1938
39. 1/01/1939
40. 1/01/1940
41. 1/01/1941
42. 1/01/1942
43. 1/01/1943
44. 1/01/1944
45. 1/01/1945
46. 1/01/1946
47. 1/01/1947
48. 1/01/1948
49. 1/01/1949
50. 1/01/1950
51. 1/01/1951
52. 1/01/1952
53. 1/01/1953
54. 1/01/1954
55. 1/01/1955
56. 1/01/1956
57. 1/01/1957
58. 1/01/1958
59. 1/01/1959
60. 1/01/1960
61. 1/01/1961
62. 1/01/1962
63. 1/01/1963
64. 1/01/1964
65. 1/01/1965
66. 1/01/1966
67. 1/01/1967
68. 1/01/1968
69. 1/01/1969
70. 1/01/1970
71. 1/01/1971
72. 1/01/1972
73. 1/01/1973
74. 1/01/1974
75. 1/01/1975
76. 1/01/1976
77. 1/01/1977
78. 1/01/1978
79. 1/01/1979
80. 1/01/1980
81. 1/01/1981
82. 1/01/1982
83. 1/01/1983
84. 1/01/1984
85. 1/01/1985
86. 1/01/1986
87. 1/01/1987
88. 1/01/1988
89. 1/01/1989
90. 1/01/1990
91. 1/01/1991
92. 1/01/1992
93. 1/01/1993
94. 1/01/1994
95. 1/01/1995
96. 1/01/1996
97. 1/01/1997
98. 1/01/1998
99. 1/01/1999
Press any key to continue . . .
for(int i=0;i<100;i++)
{
字符串年份=i.ToString();
年份=年份。左键(2,'0');
年份=年份+“0101”;
DateTime pt=DateTime.ParseExact(年份,“yyMMdd”,空);
WriteLine(“{0}.{1}”,i,pt.ToShortDateString());
}
输出:
01/01/2000
1.1/01/2001
2.1/01/2002
3.1/01/2003
4.1/01/2004
5.1/01/2005
6.1/01/2006
7.1/01/2007
8.1/01/2008
91/01/2009
101/01/2010
111/01/2011
121/01/2012
131/01/2013
141/01/2014
151/01/2015
161/01/2016
171/01/2017
181/01/2018
191/01/2019
201/01/2020
211/01/2021
221/01/2022
231/01/2023
241/01/2024
251/01/2025
261/01/2026
271/01/2027
281/01/2028
291/01/2029
301930年1月1日(奇怪的行为从这里开始)
311/01/1931
321/01/1932
331/01/1933
341/01/1934
351/01/1935
361/01/1936
371/01/1937
381/01/1938
391/01/1939
401/01/1940
411/01/1941
421/01/1942
431/01/1943
441/01/1944
451/01/1945
461/01/1946
471/01/1947
481/01/1948
491/01/1949
501/01/1950
511/01/1951
521/01/1952
531/01/1953
541/01/1954
551/01/1955
561/01/1956
571/01/1957
581/01/1958
591/01/1959
601/01/1960
611/01/1961
621/01/1962
631/01/1963
641/01/1964
651/01/1965
661/01/1966
671/01/1967
681/01/1968
691/01/1969
701/01/1970
711/01/1971
721/01/1972
731/01/1973
741/01/1974
751/01/1975
761/01/1976
771/01/1977
781/01/1978
791/01/1979
801/01/1980
811/01/1981
821/01/1982
831/01/1983
841/01/1984
851/01/1985
861/01/1986
871/01/1987
881/01/1988
891/01/1989
901/01/1990
911/01/1991
921/01/1992
931/01/1993
941/01/1994
951/01/1995
961/01/1996
971/01/1997
981/01/1998
991/01/1999
按任意键继续。
我不确定2029年或2030年有什么特别之处

谢谢


瓦伦

您使用的是专门处理的两位数年份。。。有关详细信息,请参见日期时间类型说明/特别是关于两位数年份的信息

您使用的是专门处理的两位数年份。。。有关详细信息,请参见日期时间类型说明/尤其是大约两位数的年份

yyMMdd是两位数的年份,即01、02,因为它是两位数,在某个点需要滚动,并且在2030/1929年滚动100年。这就是千禧年的错误所在,解决方案是有4位数的年份。

yyMMdd是两位数的年份,即01、02,因为它需要在某个点上滚动两位数,而在2030/1929年它可以滚动100年。这就是千禧年的错误所在,解决方案是有4位数的年份。

您需要扩展解析格式字符串,以便解析所有4位数。而且,我觉得你的代码没有什么意义。。。试着这样做:

for (int i = 2000; i < 2100; i++)
 {
       string year = i + "0101";
       DateTime pt = DateTime.ParseExact(year, "yyyyMMdd", null);
       Console.WriteLine("{0}. {1}", (i-1999), pt.ToShortDateString());
 }
for(int i=2000;i<2100;i++)
{
字符串年份=i+“0101”;
DateTime pt=DateTime.ParseExact(年份,“yyyyMMdd”,null);
Console.WriteLine(“{0}.{1}”,(i-1999),pt.ToShortDateString());
}

您需要展开解析格式字符串,以便解析所有4位数字。而且,我觉得你的代码没有什么意义。。。试着这样做:

for (int i = 2000; i < 2100; i++)
 {
       string year = i + "0101";
       DateTime pt = DateTime.ParseExact(year, "yyyyMMdd", null);
       Console.WriteLine("{0}. {1}", (i-1999), pt.ToShortDateString());
 }
for(int i=2000;i<2100;i++)
{
字符串年份=i+“0101”;
DateTime pt=DateTime.ParseExact(年份,“yyyyMMdd”,null);
Console.WriteLine(“{0}.{1}”,(i-1999),pt.ToShortDateString());
}

两位数日期解析由Calendar.TwoDigitYearMax控制。它是由您所在的地区设置的,但基本上它将任何两位数的年份解释为本世纪的年份,比如1930-2029年


请参阅。

两位数日期解析由Calendar.TwoDigitYearMax控制。它是由您所在的地区设置的,但基本上它将任何两位数的年份解释为本世纪的年份,比如1930-2029年


请参阅。

请参阅感谢buddy和其他人为您抽出时间。没问题,在您发布之前,我不知道展期日期,因此有兴趣了解它发生的确切日期。与其他人一样,我的建议是,除非被迫使用2位日期,否则尽量不要使用2位日期,并尝试使用框架中提供的内置日期操纵,而不是从字符串中解析日期,这可能会很危险。感谢buddy和其他人抽出时间。没问题,在你发布之前,我不知道展期日期,所以发现它发生的确切日期很有趣。与其他人一样,我的建议是,除非被迫使用2位日期,否则不要使用2位日期,并尝试使用框架中提供的内置日期操作,而不是从字符串解析日期,这可能会很危险。