Как решить високосный год по персидскому календарю
Сегодня 1397/02/29 (гггг / мм / дд) по персидскому календарю. и мой сайт сообщает о своей ошибке:
"Параметры Year, Month и Day описывают непредставляемый DateTime".
Я использовал datetime2 в базе данных SQL и сохранил в ней персидскую дату, преобразовав эту дату:
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 ответа
Совершенно невежественны здесь... но в целом вы должны обрабатывать "внутренне" (в программе и в БД) все даты, используя обычный Григорианский календарь 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
Если вы видите персидскую дату, то, вероятно, в вашем коде есть ошибка. Если делать SELECT
В таблице в БД вы видите персидскую дату, тогда, вероятно, в вашей БД есть ошибка.
Интересный парадокс заключается в том, что внутренне и.NET, и SQL сохраняют даты в виде единого числа, представляющего, сколько единиц времени (где в.NET единица времени составляет 100 наносекунд, в SQL это 1 день) прошло от "нуля" указывают на дату, но затем все их "стандартные" методы для обработки дат (как в.NET, так и в SQL) используют григорианский календарь (потому что он наиболее часто используется в мире).
Используйте это решение
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;
}