Как решить високосный год по персидскому календарю - PullRequest
0 голосов
/ 19 мая 2018

Сегодня по персидскому календарю 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 ]

0 голосов
/ 27 мая 2018

Используйте это решение

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;
}
0 голосов
/ 19 мая 2018

Совершенно невежественен здесь ... но в целом вы должны обрабатывать "внутренне" (в программе и в БД) все даты, используя обычный 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 день) прошло от «нулевой точки» до даты, но затем все их «стандартные» методы для обработкидаты (как в .NET, так и в SQL) используют григорианский календарь (потому что он наиболее часто используется в мире).

...