在我看来,.NET是否忽略了我传递给解析的CultureInfo(IFormatProvider)的TwoDigitYearMax属性?
具体来说,我无法解释为什么最后一行说的是1930年,而不是2030年。任何人都可以复制或解释它吗?
Windows 7,.NET 4.0,en-US系统设置。
using System;
using System.Globalization;
namespace DateTimeParse
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(System.Threading.Thread.CurrentThread.CurrentCulture.Calendar.TwoDigitYearMax);
Console.WriteLine(System.Threading.Thread.CurrentThread.CurrentCulture);
Console.WriteLine(DateTime.Parse("1/1/30"));
CultureInfo myCI = (CultureInfo)System.Threading.Thread.CurrentThread.CurrentCulture.Clone();
Console.WriteLine(DateTime.Parse("1/1/30", myCI));
Console.WriteLine(System.Threading.Thread.CurrentThread.CurrentCulture.Calendar.ToFourDigitYear(30));
myCI.Calendar.TwoDigitYearMax = 2115;
Console.WriteLine(myCI.Calendar.ToFourDigitYear(30));
Console.WriteLine(DateTime.Parse("1/1/30", myCI));
Console.ReadLine();
}
}
}
我的结果:
2029
en-US
1/1/1930 12:00:00 AM
1/1/1930 12:00:00 AM
1930
2030
1/1/1930 12:00:00 AM
答案 0 :(得分:0)
如果您按照reference source进行操作,则只需引用DateTimeFormatInfo
即可看到从CultureInfo
中提取CultureInfo.DateTimeFormat
。
Calendar
上有一个DateTimeFormatInfo
属性,这是解析时使用的属性。这两个通常是相同的(即参考相等),事实上Clone
你的CultureInfo
导致它们在克隆时各不相同 - 你可以通过reference source来看看CultureInfo.Clone()
。
您需要更改Calendar
上的DateTimeFormatInfo
:
var culture = (CultureInfo)Thread.CurrentThread.CurrentCulture.Clone();
culture.DateTimeFormat.Calendar.TwoDigitYearMax = 2115;
请参阅此处的工作示例:https://dotnetfiddle.net/IytEvz
答案 1 :(得分:0)
来自documentation for twodigityearmax
此属性允许将2位数年份正确翻译为a 4位数年份。例如,如果此属性设置为2029,则 100年的范围是从1930年到2029年。因此,2位数值为30 被解释为1930年,而2位数值29被解释为 2029。
此属性的初始值源自中的设置 控制面板的区域和语言选项部分。但是,那 信息可以在AppDomain的生命周期内发生变化。日历 class不会自动检测系统设置中的更改。如果 区域和语言选项不支持日历, 此属性的初始值是由。定义的默认值 日历课。
您的应用程序应将此值设置为99以指示该2位数 几年是字面上的。例如,如果设置了此属性 从99开始,100年范围从0开始(大多数情况下不是有效值) 日历)到99.因此,2位数值30被解释为 30。
myCI.Calendar.TwoDigitYearMax = 2115
2115
这为您提供从2016年到2115年的100年范围
myCI.Calendar.ToFourDigitYear(30)
2030
那么30岁就是该范围内的第一年30岁。
即2030