Как решить високосный год по персидскому календарю

Сегодня 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);

Что мне делать?

Связанный: stackoverflow.com/q/43180173/447156

Soner Gönül 19.05.2018 12:30
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
550
2

Ответы 2

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

reza akhlaghi 17.05.2020 08:41

для людей, которые не знакомы с персидским календарем, есть ли какой-либо авторитетный / известный источник, чтобы проверить, является ли год високосным или нет?

Pac0 28.05.2020 09:34

Привет @rezaakhlaghi, я проверил ваш вопрос и исправил ошибку. Спасибо

Jahed Kabiri 28.05.2020 09:35

@ Pac0, Да, это можно сделать с помощью метода "IsLeapYear" в классе "PersianCalendar"

Jahed Kabiri 28.05.2020 09:41

Другие вопросы по теме