2

我正在尝试使用单个格式字符串以以下格式读取日期:

"1000.12.31"
"999.12.31"
"99.12.31"

这些将对应于公元 1000 年、公元 999 年和公元 99 年的日期。

我尝试了以下格式字符串:

yyyy.M.d. 这在 999 年和 99 年都失败了。

yy.M.d. 这对于 1000 和 999 失败。它还将 99 解释为 1999。

我将求助于手动解析它(这很简单),但我很好奇这样的事情是否可以使用DateTime.ParseExact,或者使用另一种内置方法?

4

3 回答 3

2

我认为最简单的方法是使用现有的字符串,在年份前面加上几个零,然后使用现有的 DateTime.ParseExact。

无论您如何实现它,我都会进行一些手动字符串按摩,并使用 DateTime.ParseExact 进行繁重的工作。

static DateTime ParseExactYear(string input)
{
    switch (input.IndexOf('.'))
    {
        case 1: input = "000" + input; break;
        case 2: input = "00" + input; break;
        case 3: input = "0" + input; break;
    }

    return DateTime.ParseExact(input, "yyyy.M.d", null);
}

Debug.WriteLine(ParseExactYear("1000.12.31"));
Debug.WriteLine(ParseExactYear("999.12.31"));
Debug.WriteLine(ParseExactYear("99.12.31"));
Debug.WriteLine(ParseExactYear("9.12.31"));

Debug.WriteLine(ParseExactYear("1000.1.1"));
Debug.WriteLine(ParseExactYear("999.1.1"));
Debug.WriteLine(ParseExactYear("99.1.1"));
Debug.WriteLine(ParseExactYear("9.1.1"));

Output:
12/31/1000 12:00:00 AM
12/31/0999 12:00:00 AM
12/31/0099 12:00:00 AM
12/31/0009 12:00:00 AM
1/1/1000 12:00:00 AM
1/1/0999 12:00:00 AM
1/1/0099 12:00:00 AM
1/1/0009 12:00:00 AM
于 2012-06-28T17:26:08.287 回答
2

手动解析这很简单;我认为尝试使其适应与DateTime.ParseExact.

string str = "99.12.31";
int[] parts = str.Split('.').Select(int.Parse).ToArray();
DateTime date = new DateTime(parts[0], parts[1], parts[2]);
于 2012-06-28T18:39:10.693 回答
2

由于当前文化的DateTimeFormatInfo价值观,它将 99 解释为 1999。如果要更改解析行为,则必须更改DateTimeFormatInfo

string eg = "9.1.2";
DateTime dt;

var fi = new System.Globalization.DateTimeFormatInfo();
fi.Calendar = (System.Globalization.Calendar)fi.Calendar.Clone();
fi.Calendar.TwoDigitYearMax = 99;
fi.ShortDatePattern = "y.M.d";
bool b = DateTime.TryParse(eg, fi, System.Globalization.DateTimeStyles.None, out dt);

新实例DateTimeFormatInfo共享同一个Calendar对象;Clone如果要自定义特定实例,则必须这样做。

于 2012-06-28T19:25:07.637 回答