我正在尝试使用单个格式字符串以下列格式读取日期:
"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>
答案 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
。