是否可以在.NET中将非公历日期表示为DateTime

本文关键字:日期 表示 DateTime NET 是否 | 更新日期: 2023-09-27 18:25:32

我在C#中将波斯(太阳历)日期表示为DateTime时遇到了问题,特别是在特定月份的某些日子,例如,在公历中,这样的日期毫无意义:

System.Globalization.PersianCalendar p = new System.Globalization.PersianCalendar();
DateTime date = new DateTime(2013,7,22);
int year = p.GetYear(date);
int month = p.GetMonth(date);
int day = p.GetDayOfMonth(date);
DateTime d1 = new DateTime(year, month, day);

上述代码将导致ArgumentOutOfRangeException表示:Year, Month, and Day parameters describe an un-representable DateTime.

这是意料之中的事。

考虑到诸如30/02和31/04之类的日期,我如何在.NET中将波斯日期表示为DateTime

是否可以在.NET中将非公历日期表示为DateTime

上面的代码将导致ArgumentOutOfRangeException:Year、Month和Day参数描述了一个不可表示的DateTime。

是的,因为除非指定日历,否则DateTime参数应为格里高利。您可以指定日历:

DateTime d1 = new DateTime(year, month, day, p);

注意,如果你现在服用d1.Year,你会回到2013年,而不是year。。。DateTime基本上总是格里高利。但是,如果您使用的区域性将波斯日历作为默认日历,则在将DateTime格式化为字符串时,该区域性会适当地转换值。编辑:不幸的是,根据文档:

目前,PersianCalendar类不是CultureInfo类支持的任何区域性的可选日历,因此不能是默认日历。

正如一条评论提到的Noda Time,我可以指出:它还不支持波斯历。它支持农历回历,但不支持太阳历:(我可以考虑将其添加到未来的版本中…

来自MSDN

每个DateTime成员都隐式使用公历执行其操作,但指定以及具有从IFormatProvider导出的参数的方法,例如System.Globalization.DateTimeFormatInfo指定日历。

也来自PersianCalendar类

目前,PersianCalendar类不是的可选日历CultureInfo类支持的任何区域性,因此不能是默认日历。

你想要什么对我来说似乎不可能。