在我看来,.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发布于 2015-06-17 10:15:46
如果您遵循参考源,您将看到DateTimeFormatInfo是通过简单引用CultureInfo.DateTimeFormat从CultureInfo中提取的。
在Calendar上有一个DateTimeFormatInfo属性,它是用于解析的。这两者通常是相同的(即引用相等),事实上您Clone您的CultureInfo结果是不同的,因为每一个都是克隆的--您可以通过参考源 for CultureInfo.Clone()看到这一点。
您需要更改Calendar上的DateTimeFormatInfo
var culture = (CultureInfo)Thread.CurrentThread.CurrentCulture.Clone();
culture.DateTimeFormat.Calendar.TwoDigitYearMax = 2115;参见这里的一个工作示例:https://dotnetfiddle.net/IytEvz
发布于 2015-06-17 10:22:30
来自两个数字年的文件
此属性允许将2位数的年份正确地转换为4位数的年份.例如,如果将此属性设置为2029年,则100年的范围为1930至2029年。因此,2位数的30被解释为1930,而2位数的29被解释为2029. 此属性的初始值来自“控制面板”的“区域和语言选项”部分中的设置。然而,在AppDomain的生命周期中,这些信息可能会发生变化。Calendar类不会自动检测系统设置中的更改。如果区域和语言选项中不支持日历,则此属性的初始值为calendar类定义的默认值。 您的应用程序应该将此值设置为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
https://stackoverflow.com/questions/30888377
复制相似问题