首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DateTime.Parse无视我的IFormatProvider?

DateTime.Parse无视我的IFormatProvider?
EN

Stack Overflow用户
提问于 2015-06-17 10:03:33
回答 2查看 406关注 0票数 1

在我看来,.NET似乎忽略了解析所传递的CultureInfo (IFormatProvider)的TwoDigitYearMax属性?

具体来说,我无法解释为什么最后一行是1930年,而不是2030年。有人能复制或解释吗?

Windows 7,.NET 4.0,en-US系统设置.

代码语言:javascript
复制
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();
        }
    }
}

我的研究结果:

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-17 10:15:46

如果您遵循参考源,您将看到DateTimeFormatInfo是通过简单引用CultureInfo.DateTimeFormatCultureInfo中提取的。

Calendar上有一个DateTimeFormatInfo属性,它是用于解析的。这两者通常是相同的(即引用相等),事实上您Clone您的CultureInfo结果是不同的,因为每一个都是克隆的--您可以通过参考源 for CultureInfo.Clone()看到这一点。

您需要更改Calendar上的DateTimeFormatInfo

代码语言:javascript
复制
var culture = (CultureInfo)Thread.CurrentThread.CurrentCulture.Clone();
culture.DateTimeFormat.Calendar.TwoDigitYearMax = 2115;

参见这里的一个工作示例:https://dotnetfiddle.net/IytEvz

票数 0
EN

Stack Overflow用户

发布于 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.

代码语言:javascript
复制
myCI.Calendar.TwoDigitYearMax = 2115
2115

这就给出了从2016年到2115年间的100年。

代码语言:javascript
复制
myCI.Calendar.ToFourDigitYear(30)
2030

所以30年是第一年在这个范围内的第30年。即2030

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30888377

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档