0

我想使用波斯日历类将波斯日期更改为 C#中的标准DateTime格式。但由于将年份更改为1400,它会引发如下异常

ArgumentOutOfRangeException: Specified time is not supported in this calendar. It should be between 22/03/22 12:00:00 AM (Gregorian date) and 99/12/31 11:59:59 PM (Gregorian date), inclusive. (Parameter 'time')
Actual value was 0.

我检查了波斯日历类,发现了这个:

if (year < 1 || year > MaxCalendarYear || month < 1 || month > 12)
{
  throw new ArgumentOutOfRangeException(null, SR.ArgumentOutOfRange_BadYearMonthDay);
}

抛出异常。现在我应该怎么做才能解决这个问题?

4

2 回答 2

2

为什么不在PersianCalendar类的帮助下式转换?

using System.Globalization;

...

// What does Gregorian date correspond to Persian new year (1400)? 
int year = 1400;
int month = 1;
int day = 1;

DateTime result = new PersianCalendar().ToDateTime(year, month, day, 0, 0, 0, 0);

Console.WriteLine($"{result:dd MMMM yyyy}");

结果:

21 March 2021

ArgumentOutOfRangeException当至少一个参数超出范围时抛出:month应该在1..12等范围内。

于 2021-04-28T11:16:07.903 回答
2

概括

您将一个空的DateTime(例如new DateTime())传递给强大的方法之一PersianCalendar

请注意,它DateTime是 a struct(不是 a class),并且任何未初始化/设置的类型的属性或变量DateTime都将具有此最小值。

也许您正在反序列化一个没有此值但类的属性不可为空的 json。也许数据库中的列为空,但模型的属性不可为空等。

细节

CheckTicksRange该异常是由类中许多方法调用的PersianCalendar 的方法引发的:

internal static void CheckTicksRange(long ticks)
{
    if (ticks < s_minDate.Ticks || ticks > s_maxDate.Ticks)
    {
        throw new ArgumentOutOfRangeException(
            "time",
            ticks,
            SR.Format(SR.ArgumentOutOfRange_CalendarRange, s_minDate, s_maxDate));
    }
}

您收到的错误消息以 string: 结尾Actual value was 0.。这意味着传入的DateTime有 0 个刻度,这意味着它是空的。

例如:

try
{
    new PersianCalendar().GetYear(time: new DateTime());
}
catch (Exception ex)
{
    Console.WriteLine(ex.Message);
}

这导致:

Specified time is not supported in this calendar. It should be between 22/03/0622 00:00:00 (Gregorian date) and 31/12/9999 23:59:59 (Gregorian date), inclusive. (Parameter 'time')
Actual value was 0.  

请注意“实际值为 0。”。

另请注意,在我的语言环境中,例外情况更清楚一些,因为日期包含 4 位数的年份。

如果我们使用无效的日期,但不是空的,则异常消息的结尾会有所不同:

new PersianCalendar().GetYear(time: new DateTime(year: 622, month: 1, day: 1));

结果是:

Specified time is not ... 
... 'time')
Actual value was 195968160000000000.
于 2021-04-28T11:51:10.917 回答