如何解决波斯日历中的闰年问题

时间:2018-05-19 08:32:04

标签: c# datetime leap-year persian-calendar

今天是波斯日历中的1397/02/29(yyyy / mm / dd)。 我的网站报告了他的错误:

  

'年,月和日参数描述了无法表示的DateTime。'

我在SQL数据库中使用了datetime2,并通过转换此日期保存了波斯语日期:

PersianCalendar pc = new PersianCalendar();
DateTime dateTime = DateTime.Now;
return new DateTime(pc.GetYear(dateTime), pc.GetMonth(dateTime), pc.GetDayOfMonth(dateTime), pc.GetHour(dateTime), pc.GetMinute(dateTime), pc.GetSecond(dateTime), 0);

我该怎么办?

2 个答案:

答案 0 :(得分:2)

这里相当无知......但总的来说,你应该在内部对待" (在程序和数据库中)使用普通Proleptic Gregorian日历(根据ISO 8601)的所有日期,并且仅当您从用户/写入输出读取用户的输入时才将它们重新格式化为波斯语。 .NET中有一个PersianCalendar类可以帮助将波斯语转换为美国语并返回。

例如

var pc = new PersianCalendar(); 
DateTime dt = pc.ToDateTime(1397, 02, 29, 0, 0, 0, 0); 

工作正常,但是如果你看一下dt变量,你会看到它显示为2018-05-19。

如果在ToString()变量上执行DateTime,您会看到一个波斯日期,那么您的代码可能会出错。如果在数据库中的某个表上执行SELECT,您会看到一个波斯日期,那么您的数据库中可能会出错。

有趣的悖论是,.NET和SQL内部将日期保存为单个数字,表示已经过了多少时间单位(在.NET中,单位时间为100纳秒,在SQL中为1天) a"零点"到目前为止,但随后他们所有的标准"处理日期的方法(在.NET和SQL中)使用格里高利历(因为它是世界上使用最多的日历)。

答案 1 :(得分:0)

使用此解决方案

static void Main(string[] args)
{
    Console.WriteLine(GetIsLeapDateTime(1358));
    Console.WriteLine(GetIsLeapDateTime(1359));
    Console.WriteLine(GetIsLeapDateTime(1360));
    Console.WriteLine(GetIsLeapDateTime(1361));
    Console.WriteLine(GetIsLeapDateTime(1362));
    Console.WriteLine(GetIsLeapDateTime(1363));
    Console.WriteLine(GetIsLeapDateTime(1364));
    Console.WriteLine(GetIsLeapDateTime(1365));
    Console.WriteLine(GetIsLeapDateTime(1366));
    Console.ReadLine();
}

private static bool GetIsLeapDateTime(int year, int month = 10, int day = 11, int hour = 0, int minute = 0, int second = 0, int millisecond = 0)
{
    bool isLeap = false;
    PersianCalendar pc = new PersianCalendar();
    DateTime gregorian = pc.ToDateTime(year, month, day, hour, minute, second, millisecond);
    if (DateTime.IsLeapYear(gregorian.Year))
    {
        isLeap = true;
    }
    return isLeap;
}