DateTime.ParseExact为非常规年份

时间:2012-06-28 17:15:44

标签: c# date

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

"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或者使用其他内置方法来实现这样的事情?< / p>

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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]);

答案 2 :(得分: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