DateTime.Parse("AD3AD08")

[2017-08-03 12:00:00 AM]

为什么该字符串(在我看来就像是普通的十六进制字符串)被成功解析为日期?我可以看到3和8被解析为几个月和几天。但是否则对我来说这没有意义。

最佳答案

tl;博士:您可以使用 DateTimeFormatInfo.GetEraName / GetAbbreviatedEraName 返回的内容作为分隔符,而无需考虑大小写。顺序为:日,月,年(可选)。

看来您总是可以将日历的当前era's abbreviated namefull era-name用作DateTime token 的定界符。对于英语文化,它是ADA.D.,例如对于德国文化,它是n. Chr.

var enCulture = new CultureInfo("en-GB");
System.Threading.Thread.CurrentThread.CurrentCulture = enCulture;
var fi = enCulture.DateTimeFormat;
int currentEra = enCulture.Calendar.GetEra(DateTime.Now);
var eraName = fi.GetEraName(currentEra);
var shortEra = fi.GetAbbreviatedEraName(currentEra);
var date = DateTime.Parse($"{shortEra}3{shortEra}08"); // AD or A.D. works

var deCulture = new CultureInfo("de-DE");
System.Threading.Thread.CurrentThread.CurrentCulture = deCulture;
fi = deCulture.DateTimeFormat;
currentEra = deCulture.Calendar.GetEra(DateTime.Now);
eraName = fi.GetEraName(currentEra);
shortEra = fi.GetAbbreviatedEraName(currentEra);
date = DateTime.Parse($"{shortEra}3{shortEra}08");  // n. Chr. works

有趣的是,它不区分大小写,因此ad也可以使用。记录在 DateTimeFormatInfo.GetEra 中:



阳历只有一个时代,因此Calendar.GetEra(DateTime.Now)并不是必需的。我还没有找到任何进一步的文档。

以下是一些可以正常使用并将在2017年圣诞节前解析的示例:
DateTime christmas  = DateTime.Parse("ad25ad12ad2017ad");
christmas = DateTime.Parse("AD25ad12ad2017");
christmas = DateTime.Parse("25ad12ad2017AD");
christmas = DateTime.Parse("25ad12ad2017");
christmas = DateTime.Parse("A.D.25ad12ad2017");
christmas = DateTime.Parse("A.D.25ad12ad");  // current year is used
christmas = DateTime.Parse("A.D.25ad12");    // current year is used

关于c# - 为什么AD3AD08在.NET Framework中代表有效日期?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43339856/

10-14 19:27
查看更多