Как «прибавить год» в еврейском календаре?

Я пытаюсь поддерживать еврейский календарь в своем проекте Noda Time , и мне нужно поддержать операцию «добавить год» — или, в более общем смысле, ответить на вопрос «Учитывая исходную дату и целевой номер года, что получится в результате?» свидание?"

Во-первых, я хотел бы проверить, правильно ли я говорю, что Microsoft неправильно дает ответ в .NET. Например, рассмотрим дату этого поста: 8 Сивана, 5774 год. Сиван — это 10-й месяц в системе нумерации гражданских месяцев високосного года, а 5774 год — високосный. Если мы добавим один год к сегодняшней дате, .NET сохранит номер месяца (10), оставив нам 8-й тамуз, 5775, потому что 5775 не високосный год. (Вспомогательный код находится внизу этого вопроса 1 .) Мне это кажется неправильным - следует сохранить сам месяц, а не номер месяца .

Предполагая, что мой подход верен (и что мы должны более разумно закончить с номером месяца 9, который является Сиваном в невисокосный год), это все еще оставляет некоторые крайние случаи:

  • Что нам делать, если мы добавим год к 30-му числу месяца Хешван, а в полученном году Хешвана будет только 29 дней?
  • Точно так же, что мы должны сделать, если мы добавим год к 30-му Кислеву, и в Кислеве будет только 29 дней в полученном году?
  • Что нам делать, если мы добавим год к дате в Адаре I, в результате чего год будет не високосным?
    • Частный случай: что нам делать, если мы добавим год к 30-му Адару I?
  • Что нам делать, если мы добавим год к дате в Адар II, в результате чего год не будет високосным?
  • Что нам делать, если мы добавим год к дате в адар, в результате чего год станет високосным?

У меня есть предложение:

  • Если вы начинаете с даты в адар I или адар II и целевой год не является високосным, результат должен быть в адар
  • Если вы начинаете с даты в адаре, а целевой год является високосным, результат должен быть в адаре II.
  • Если результат будет длиннее, чем длина месяца в цели, усеките его до последнего дня месяца (так, 30-е число адара я сопоставлю с 29-м числом адара, а примеры хешвана/кислева будут усечены до 29-го числа адара). тот же месяц)

Я считаю, что это близко, но не совсем так, как правило дня рождения, указанное в Календарных расчетах ( задокументировано для Hebcal ), где 30-е число (Адар I/Кислев/Хешван) будет сопоставлено с 1-м числом следующего месяца... но так пока приведенное выше предложение разумно в соответствии с еврейской традицией, оно будет более соответствовать другим аспектам моего кодекса. (Я рад выбросить последовательность из окна, если есть веская причина, но я бы предпочел сохранить ее в противном случае.)

Одним из проблемных аспектов всего этого является то, что он должен быть вне контекста. Я знаю, что вполне могут быть разные правила для разных контекстов, но, к сожалению, мне нужно правило «общего назначения».

Итак, разумно ли это предложение, или мне еще многое предстоит узнать о том, как отвечать даже на простые вопросы о еврейском календаре?


1 Справочный код .NET:

using System;
using System.Globalization;

class Test
{
    static void Main()
    {
        var calendar = new HebrewCalendar();
        DateTime start = new DateTime(5774, 10, 8, calendar);
        // Prints 5774-10-08
        Console.WriteLine(FormatYearMonthDay(start, calendar));
        DateTime end = calendar.AddYears(start, 1);
        // Prints 5775-10-08
        Console.WriteLine(FormatYearMonthDay(end, calendar));
    }

    static string FormatYearMonthDay(DateTime date, Calendar calendar)
    {
        return string.Format("{0}-{1}-{2}",
                             calendar.GetYear(date),
                             calendar.GetMonth(date),
                             calendar.GetDayOfMonth(date));
    }
}
Хотя я иногда программирую, я не полностью разбираюсь в вашем коде .NET. Тем не менее, я рекомендую вам заглянуть на Hebcal.com. Насколько я помню, у них есть ссылка на какой-то код, который определяет, как вычислять даты в еврейском календаре. Таким образом, не существует «общего» правила для «добавления года», поскольку правила для преследователя и малеха действительно основаны на моладе Рош ха-Шанна, високосном году И правилах отсрочки. Я рекомендую вам ознакомиться с этими правилами, прежде чем вы начнете «быстрое программирование».
@DanF: у меня есть рабочий код для расчета даты с точки зрения преобразования григорианского календаря в еврейский, определения високосных лет, длины месяцев и т. д. ... но это другое дело. Если нет общепринятого ответа на любую дату, то я, вероятно, просто использую свое предложение как «общеразумное» :)
@Lucian: я не понимаю, как это конкретно относится к вопросу. У меня уже есть много кода для преобразования любой отдельной даты из одного календаря в другой. Вопрос в том, что значит «прибавить год» к дате в еврейском календаре, если соответствующий месяц не существует в последующем году.

Ответы (2)

Вы правы в том, что реализация .NET, по-видимому, не соответствует Галахе (т.е. еврейскому закону) ( Орах Хаим 55:10 и Мишне Берура там же), и ваши первые 2 правила верны и соответствуют Галахе .

Расчеты по еврейскому закону (там же, MB 45) правильно реализованы в HebCal вопреки вашему третьему правилу. В частности, если мальчик родился 30 хешвана 5700 года, его бар-мицва, отмечаемая через 13 лет, приходится на 1 кислева 5713 года.

Интересно, что если мальчик родился 1 кислева 5700 г., когда в хешване было всего 29 дней, он будет отмечать свою бар-мицву 30 хешвана 5713 г. Предположительно, возможно, HebCal опускает это правило, поскольку оно может зависеть от контекста бар-мицвы. предметом споров (см. Shaarei Teshuva , там же), а также кажется аномальным. См. здесь обоснование этого решения (стр. 11, вверху).

Я предполагаю, что пользователи расчетов еврейского календаря (такие как я!) будут ожидать соответствия еврейскому закону, потому что, вероятно, именно поэтому они используют календарь в первую очередь. Любая другая реализация будет сбивать с толку, несмотря на алгоритмическую элегантность или согласованность с существующим кодом.

Если бы мне пришлось реализовать эту функцию, я, вероятно, следовал бы правилам HebCal и, возможно, перегрузил бы addYearsметод, чтобы он принимал boolean isBarMitzvaпараметр, который будет соответствовать правилам бар-мицвы. Таким образом, пользователи поймут, что календарные расчеты могут выполняться по другим правилам и не приведут к неожиданным результатам.


PS Я большой поклонник вашего "C# in Depth" и рекомендую его всем своим студентам.

Одинакова ли галаха для штара (например, ссуды, подлежащей выплате ровно через год)? Я думаю, что это было бы более подходящим контекстом в данном случае.
@Yishai - интересный момент. Мне нужно будет разобраться в этом, но я предполагаю, что, как и недарим, кредиты зависят от идиоматического употребления ( лашон бней адам ), и поскольку и 1 Кислев, и 30 Хесван или называются Рош Ходеш Кислев (см. Маген Авраам, там же), они эквивалентно тому, что указано в ответе.
Спасибо большое. Я надеялся, что это достаточно контекстно-зависимое правило, чтобы правило более согласованного с Noda-Time было бы достаточно хорошим, но похоже, что правило «1-го числа следующего месяца» является более разумным по умолчанию. Реализация будет очень простой - сложнее решить, где это задокументировать ;)
@yoni, я посмотрел, и ты прав, это зависит от loshon bnei adam. 30-е число одного года будет рош ходеш следующего.
@JonSkeet также стоит отметить, что по прошествии одного года, когда вы начинаете с Адара в ходе обсуждения (сюрприз-сюрприз), будет ли следующий год високосным. В периоды траурных расчетов или поминальных церемоний некоторые считали Адар I годом позже, некоторые ждали только Адара II. И таких примеров гораздо больше, так что я бы не стал пытаться выставлять их все через API...
@synhershko: Я определенно не буду пытаться охватить все разные контексты. В данном случае я просто воспользуюсь контекстом «день рождения» — и тщательно задокументирую его! (Для разработчиков не должно быть слишком сложно реализовать разные подходы, если они хотят. Возможно, менее эффективные, но это нормально.)

Вы правы, для Адара I и Адара II результатом добавления года обычно будет Адар II, поскольку первый Адар (Адар I) является добавленным месяцем.

Что касается лишнего дня в месяце, то вообще все сдвигается на день вперед. (30 хешван == 1 кислев).

(Есть исключения из этого, но я думаю, что как правило - вы охватываете большинство случаев, для которых будет использоваться ваш календарь. Возможно, было бы полезно добавить перегрузку для выполнения «тупых» вычислений, как внедрение Microsoft.)

Привет Хайшай! Добро пожаловать в Mi Yodeya, и большое спасибо за публикацию этого ответа. Ваш пост будет более ценным, если вы отредактируете источники для своих утверждений. Я надеюсь, что вы просмотрите сайт и найдете другие сообщения, достойные вашего времени, возможно, включая наши 189 других вопросов календаря .