今天是波斯日历中的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);
我该怎么办?
答案 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;
}