【问题标题】:C# DateTime.ParseExact determining year prefixC# DateTime.ParseExact 确定年份前缀
【发布时间】:2013-12-03 03:54:09
【问题描述】:

我对解析“dd/MM/yy”形式的日期字符串有一个要求,这样如果年份被认为比当前年份大 30 年,那么它将在年份前加上 19。在另一个例如它以 20 为前缀。

例子:

01/01/50 -> 01/01/1950
01/01/41 -> 01/01/2041

我不确定 DateTime.ParseExact 如何决定它应该使用什么前缀,或者我如何以一种或另一种方式强制它(它似乎做出了一个合理的假设,如 01/01/12 -> 01/01/ 2012,我只是不知道如何规定它会切换的点)。

【问题讨论】:

  • 我认为ParseExact 不可能。
  • 是否可以使用 c# date api 的任何部分,或者我是否正在考虑编写自己的条件块来在解析之前执行转换?

标签: c# date datetime


【解决方案1】:

使用Calendar.TwoDigitYearMax 属性。

获取或设置可以表示的 100 年范围的最后一年 按 2 位数的年份。

在你的情况下,这样的事情会起作用:

// Setup 
var cultureInfo = (CultureInfo)Thread.CurrentThread.CurrentCulture.Clone();
var calendar = cultureInfo.Calendar;
calendar.TwoDigitYearMax = DateTime.Now.Year + 30;
cultureInfo.DateTimeFormat.Calendar = calendar;

// Parse
var _1950 = DateTime.ParseExact("01/01/50", "dd/MM/yy", cultureInfo);
var _2041 = DateTime.ParseExact("01/01/41", "dd/MM/yy", cultureInfo);

【讨论】:

  • 这是否适用于ParseExact,或者您是否建议使用Calendar.ToFourDigitYear() 将其转换为四位数年份,然后使用ParseExact? +1 知道这甚至存在
  • 这适用于ParseExact,因为它需要CultureInfo 作为参数。
【解决方案2】:

我不认为ParseExact 可以完成你的工作,所以这里是我的带有conditional blocks 的版本但是可以工作。

试试这个:

            DateTime currentDate = DateTime.Now;
            String strDate = "01/01/41";
            DateTime userDate=DateTime.ParseExact(strDate, "dd/MM/yy", System.Globalization.CultureInfo.InvariantCulture);
            currentDate=currentDate.AddYears(30);
            if ((userDate.Year%100) > (currentDate.Year%100))
            {
                strDate = strDate.Insert(6, "19");
            }
            else
            {
                strDate = strDate.Insert(6, "20");
            }
            DateTime newUserDate = DateTime.ParseExact(strDate, "dd/MM/yyyy", System.Globalization.CultureInfo.InvariantCulture);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-22
    • 1970-01-01
    • 2017-02-21
    • 2019-08-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多