1

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

“年、月和日参数描述了无法表示的日期时间。”

我在 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);

我应该怎么办?

4

2 回答 2

2

这里很无知......但一般来说,您应该使用正常的Proleptic 公历(根据 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变量执行 a 会看到波斯日期,那么您的代码中可能有错误。如果SELECT在数据库中的表上执行操作,您会看到波斯日期,那么您的数据库中可能有错误。

有趣的悖论是,.NET 和 SQL 在内部都将日期保存为一个数字,表示从“零”过去了多少个时间单位(在 .NET 中一个时间单位是 100 纳秒,在 SQL 中是 1 天)指向”日期,但是他们处理日期的所有“标准”方法(在 .NET 和 SQL 中)都使用公历(因为它是世界上最常用的)。

于 2018-05-19T08:42:07.270 回答
1

使用此解决方案

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)
{
    PersianCalendar pc = new PersianCalendar();
    return pc.IsLeapYear(year);
}

在贾拉里日历

似乎每 33 年,闰年每 5 年发生一次,然后每 4 年发生一次。

1370 是闰年,但 1374 不是闰年,而 1375 是闰年。此外,1403 不是闰年,1407 不是闰年,而是 1408 闰年。

于 2018-05-26T22:39:53.407 回答