21

以下代码段的结果是“12/06/1930 12:00:00”。如何控制隐含的世纪,以使“30 年 6 月 12 日”变为 2030 年?

    string dateString = "12 Jun 30"; //from user input
    DateTime result;
    DateTime.TryParse(dateString, new System.Globalization.CultureInfo("en-GB"),System.Globalization.DateTimeStyles.None,out result);
    Console.WriteLine(result.ToString());

请暂时搁置这样一个事实,即正确的解决方案是首先正确指定日期。

注意:结果与运行代码的电脑的系统日期时间无关。

答:谢谢Deeksy

    for (int i = 0; i <= 9; i++)
    {
        string dateString = "12 Jun " + ((int)i * 10).ToString();
        Console.WriteLine("Parsing " + dateString);
        DateTime result;
        System.Globalization.CultureInfo cultureInfo = new System.Globalization.CultureInfo("en-GB");
        cultureInfo.Calendar.TwoDigitYearMax = 2099;
        DateTime.TryParse(dateString, cultureInfo , System.Globalization.DateTimeStyles.None, out result);
        Console.WriteLine(result.ToString());
    }
4

5 回答 5

24

这很棘手,因为两位数年份与 TryParse 一起使用的方式是基于您正在使用的 CultureInfo 对象的 Calendar 属性的 TwoDigitYearMax 属性。(CultureInfo->日历->TwoDigitYearMax)

为了使两位数的年份前有 20,您需要手动创建一个 CultureInfo 对象,该对象具有一个日历对象,其中 2099 设置为 TwoDigitYearMax 属性。不幸的是,这意味着解析的任何两位数日期都会有 20 个前缀(包括 98、99 等),这可能不是您想要的。

我怀疑您最好的选择是使用第 3 方日期解析库,而不是使用 +50/-50 年规则 2 位数年份的标准 tryparse。(2 位数的年份应转换为今年前 50 年和比今年大 50 年之间的范围)。

或者,您可以覆盖日历对象(它是虚拟的)上的 ToFourDigitYear 方法并使用它来实现 -50/+50 规则。

于 2009-11-19T03:08:49.757 回答
12

我会写一个可重用的函数:

public static object ConvertCustomDate(string input)
{
    //Create a new culture based on our current one but override the two
    //digit year max.
    CultureInfo ci = new CultureInfo(CultureInfo.CurrentCulture.LCID);
    ci.Calendar.TwoDigitYearMax = 2099;
    //Parse the date using our custom culture.
    DateTime dt = DateTime.ParseExact(input, "MMM-yy", ci);
    return new { Month=dt.ToString("MMMM"), Year=dt.ToString("yyyy") };
}

这是我的准日期字符串列表

List<string> dates = new List<string>(new []{
    "May-10",
    "Jun-30",
    "Jul-10",
    "Apr-08",
    "Mar-07"
});

像这样扫描它:

foreach(object obj in dates.Select(d => ConvertCustomDate(d)))
{
    Console.WriteLine(obj);
}

请注意,它现在将 30 处理为 2030 而不是 1930...

于 2010-08-18T17:32:11.563 回答
3

您正在寻找Calendar.TwoDigitYearMax 属性

Jon Skeet 在此发布了一些您可能会发现有用的内容。

于 2009-11-19T03:24:58.290 回答
1

我有一个类似的问题,我用正则表达式解决了它。在您的情况下,它看起来像这样:

private static readonly Regex DateRegex = new Regex(
@"^[0-9][0-9] (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) [0-9][0-9]$",
RegexOptions.Compiled | RegexOptions.ExplicitCapture);

private static string Beautify(string date)
{
    var match = DateRegex.Match(date);
    if (match.Success)
    {
        // Maybe further checks for correct day
        return date.Insert("dd-MMM-".Length, "20");
    }

    return date;
}
于 2018-02-11T18:25:12.153 回答
-1
result = year.ToString().Length == 1 
      || year.ToString().Length == 2 ? "1" 
       : (Convert.ToInt32(year.ToString()
          .Substring(0, (year.ToString().Length - 2))) + 1).ToString();
于 2015-02-11T10:19:34.067 回答