Я написал код ниже и хочу добавить 4 месяца к «1402/12/29» и ожидать, что он вернет значение «1403/04/31», но он вернет «1403/4/29».
int persianYear = 1402;
int persianMonth = 12;
int persianDay = 29;
PersianCalendar pc = new PersianCalendar();
DateTime gregorianDate = pc.ToDateTime(persianYear, persianMonth, persianDay, 0, 0, 0, 0);
var newDt =pc.AddMonths(gregorianDate, 4);
int persianYear2 = pc.GetYear(newDt);
int persianMonth2 = pc.GetMonth(newDt);
int persianDay2 = pc.GetDayOfMonth(newDt);
string dt = $"{persianYear2}/{persianMonth2}/{persianDay2}";
Console.WriteLine(dt);
@SELA: это часть .NET.
Ох, спасибо... позвольте мне проверить и попытаться ответить @JonSkeet
Почему вы ожидаете, что он вернется 1403/04/31? Вы добавляете 4 месяца к «29-му числу месяца», поэтому я ожидаю, что это все равно будет 29-е число месяца. Тем не менее, вы добавляете месяцы в григорианский календарь...
@JonSkeet: 12-й месяц персидского календаря состоит из 29 дней, а первые 6 месяцев — 31 день.
@AlirezaGhalamkari: Однако это не объясняет ваших ожиданий. Если к 28-му прибавить 4 месяца, ожидаете ли вы, что результат будет 30-м? А как насчет добавления 4 месяцев к 15-му? Непонятно, почему вы ожидаете, что 29-е станет 31-м. (Прибавление 4 месяцев к 31-му числу может привести к 29-му числу из-за усечения, если в целевом месяце всего 29 дней, но это другое дело, потому что тогда «естественный» результат просто недействителен.)
Здесь есть две проблемы:
Вы не добавляете месяцы в персидский календарь — вы добавляете месяцы в григорианский календарь, а затем конвертируете этот григорианский результат в персидский календарь.
DateTime
в принципе не поддерживает идею «даты в определенном календаре».
Возможно, вы захотите использовать мой проект Noda Time, который это поддерживает. Образец кода:
using NodaTime;
var start = new LocalDate(1402, 12, 29, CalendarSystem.PersianArithmetic);
var end = start.PlusMonths(4);
Console.WriteLine(end.ToString("uuuu-MM-dd", null));
(PersianArithmetic
соответствует поведению PersianCalendar
, начиная с .NET 4.6.)
Теперь, с точки зрения ожиданий, добавление 4 месяцев к дате, которая приходится на 29-е число месяца, всегда будет давать «29-е число итогового месяца», если в нем 29 дней. Если вы ожидали получить 31-е число, потому что сейчас конец месяца, вам нужно будет указать это явно.
Так получилось, что ваш код уже дал вам то, что я считаю правильным ответом, но не то, что вы ожидали.
Если вы хотите узнать «конец месяца на 4 месяца позже заданного месяца», в Noda Time вы должны сделать это — обратите внимание на With(DateAdjusters.EndOfMonth)
:
using NodaTime;
var start = new LocalDate(1402, 12, 29, CalendarSystem.PersianArithmetic);
var end = start.PlusMonths(4).With(DateAdjusters.EndOfMonth);
Console.WriteLine(end.ToString("uuuu-MM-dd", null));
Теперь результат 1403-04-31.
Можете ли вы поделиться или включить
PersianCalendar.cs
класс в свой вопрос, пожалуйста?