Сегодня 1397/02/29 (гггг / мм / дд) по персидскому календарю. и мой сайт сообщает об ошибке:
'Year, Month, and Day parameters describe an un-representable 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);
Что мне делать?





Совершенно невежественный здесь ... но в целом вы должны обрабатывать «внутренне» (в программе и в базе данных) все даты, используя обычный календарь Пролептик григорианский (согласно ISO 8601), и переформатировать их на персидский только тогда, когда вы читаете ввод из пользователь / запись вывода пользователю. В .NET есть класс Персидский календарь, который помогает преобразовывать персидский язык в американский и обратно.
Например
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)
{
PersianCalendar pc = new PersianCalendar();
return pc.IsLeapYear(year);
}
в календаре Джалали
Кажется, что каждые 33 года високосные годы происходят один раз в 5 лет, а затем снова каждые 4 года.
1370 - високосный год, но 1374 - не високосный, а 1375 - високосный год. Кроме того, 1403 год - не високосный, а 1407 - не високосный, а 1408 високосный год.
привет @jahed, это не работает для 1398, 1399 1398 не високосный год и 1399 високосный год
для людей, которые не знакомы с персидским календарем, есть ли какой-либо авторитетный / известный источник, чтобы проверить, является ли год високосным или нет?
Привет @rezaakhlaghi, я проверил ваш вопрос и исправил ошибку. Спасибо
@ Pac0, Да, это можно сделать с помощью метода "IsLeapYear" в классе "PersianCalendar"
Связанный: stackoverflow.com/q/43180173/447156