¿Cómo se "agrega un año" en el calendario hebreo?

Estoy tratando de admitir el calendario hebreo en mi proyecto Noda Time y necesito admitir una operación de "agregar un año" o, de manera más general, responder a la pregunta "Dada una fecha original y un número de año objetivo, ¿cuál es el resultado ¿fecha?"

En primer lugar, me gustaría comprobar que tengo razón al decir que Microsoft obtiene la respuesta incorrecta en .NET. Por ejemplo, considere la fecha de esta publicación: 8 de Sivan, 5774. Sivan es el mes 10 en el sistema de numeración de meses civil en un año bisiesto, y 5774 es un año bisiesto. Si agregamos un año a la fecha de hoy, .NET mantiene el número de mes (10) dejándonos con el 8 de Tamuz, 5775, porque 5775 no es un año bisiesto. (El código de apoyo se encuentra al final de esta pregunta 1 ). Para mí, esto me parece incorrecto: es el mes en sí lo que debe conservarse, no el número del mes .

Suponiendo que mi enfoque sea correcto (y que sería más razonable terminar con un número de mes de 9, que es Sivan en un año no bisiesto), eso aún deja algunos casos extremos:

  • ¿Qué debemos hacer si agregamos un año al 30 de Heshvan, y Heshvan solo tiene 29 días en el año resultante?
  • De manera similar, ¿qué deberíamos hacer si agregamos un año al 30 de Kislev, y Kislev solo tiene 29 días en el año resultante?
  • ¿Qué debemos hacer si agregamos un año a una fecha en Adar I, lo que da como resultado un año no bisiesto?
    • Caso especial: ¿qué debemos hacer si le sumamos un año al 30 de Adar I?
  • ¿Qué debemos hacer si agregamos un año a una fecha en Adar II, lo que da como resultado un año no bisiesto?
  • ¿Qué debemos hacer si sumamos un año a una fecha en Adar, resultando un año bisiesto?

Tengo una propuesta:

  • Si comienza con una fecha en Adar I o Adar II y el año objetivo no es un año bisiesto, el resultado debería estar en Adar
  • Si comienza con una fecha en Adar y el año objetivo es un año bisiesto, el resultado debería estar en Adar II
  • Si el resultado fuera más largo que la duración del mes en el objetivo todavía, trunque hasta el último día del mes (por lo que el 30 de Adar se asignaría al 29 de Adar, y los ejemplos de Heshvan/Kislev se truncarían al 29 del mes). mismo mes)

Creo que esto está cerca, pero no es lo mismo, que la regla de cumpleaños especificada en Cálculos calendáricos ( documentados para hebcal ), donde el 30 de (Adar I/Kislev/Heshvan) se asignaría al 1 del próximo mes... pero así siempre que la propuesta anterior sea razonable según la tradición judía, sería más consistente con otros aspectos de mi código. (Estoy feliz de tirar la consistencia por la ventana si hay una buena causa, pero prefiero mantenerla de lo contrario).

Un aspecto problemático de todo esto es que tiene que ser independiente del contexto. Soy consciente de que puede haber diferentes reglas para diferentes contextos, pero desafortunadamente necesito tener una regla de "propósito general".

Entonces, ¿es esta una propuesta razonable, o todavía tengo mucho que aprender sobre cómo responder incluso preguntas simples sobre el calendario hebreo?


1 Código .NET de referencia:

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));
    }
}
Aunque ocasionalmente programo, no tengo la competencia completa de su código .NET. De todos modos, le recomiendo que consulte Hebcal.com. Lo último que recuerdo, creo que tienen un enlace a algún código que determina cómo calcular las fechas en el calendario hebreo. En resumen, no existe una regla "general" para "agregar un año", ya que las reglas para chaser y maleh se basan realmente en el molad de Rosh Hashannah, el año bisiesto Y las reglas de aplazamiento. Le recomiendo que lea estas reglas antes de comenzar con la "codificación rápida".
@DanF: tengo un código de trabajo para calcular una fecha en términos de conversión entre el calendario gregoriano y el calendario hebreo, calcular cuándo son los años bisiestos, cuánto duran los meses, etc., pero eso es un asunto diferente. Si no hay una respuesta generalmente aceptada para una fecha determinada, entonces probablemente usaré mi propuesta como "generalmente sensata" :)
@Lucian: No veo cómo se relaciona eso con la pregunta en particular. Ya tengo mucho código para convertir cualquier fecha de un calendario a otro. La pregunta es qué significa "añadir un año" a una fecha en el calendario hebreo donde el mes correspondiente no existe en el año siguiente.

Respuestas (2)

Tiene razón en que la implementación de .NET aparentemente no es consistente con Halajá (es decir, la ley judía) ( Oraj Chaim 55:10 y Mishne Berurah ibid) y sus primeras 2 reglas son correctas y consistentes con Halajá .

Los cálculos de la ley judía (ibíd., MB 45) se implementan correctamente en HebCal en contra de su tercera regla. Específicamente, si un niño nace el 30 Jeshvan, 5700, su Bar Mitzvah, celebrado dentro de 13 años, caerá el 1 Kislev, 5713.

Curiosamente, si un niño nace el 1 de Kislev de 5700 cuando Jeshvan tenía solo 29 días, celebrará su Bar Mitzvah el 30 de Jeshvan de 5713. Especulativamente, tal vez HebCal omite esta regla ya que puede depender del contexto de Bar Mitzvah, es un tema de debate (ver Shaarei Teshuva , ibid), y también parece anómalo. Consulte aquí la justificación de esta decisión (página 11, arriba).

Mi conjetura es que los usuarios de los cálculos del calendario hebreo (¡como yo!) esperarán coherencia con la ley judía porque es probable que esa sea la razón por la que están usando el calendario en primer lugar. Cualquier otra implementación será confusa, a pesar de la elegancia algorítmica o la coherencia con el código existente.

Si implementara esta característica, probablemente seguiría las reglas de HebCal y posiblemente sobrecargaría el addYearsmétodo para tomar un boolean isBarMitzvaparámetro que sea consistente con las reglas de Bar Mitzva. De esta forma los usuarios entenderán que los cálculos calendáricos pueden seguir reglas diferentes y no obtendrán resultados inesperados.


PD: Soy un gran admirador de su "C# en profundidad" y recomiendo que todos mis alumnos lo obtengan.

¿Es la halajá la misma para un shtar (por ejemplo, un préstamo pagadero exactamente en un año)? Creo que ese sería el contexto más relevante en este caso.
@Yishai: punto interesante. Tendré que investigar esto, pero supongo que, al igual que nedarim, los préstamos dependen del uso idiomático ( lashon bnei adam ) y dado que tanto 1 Kislev como 30 Chesvan o llamado Rosh Jodesh Kislev (ver Magen Avraham, ibid), son equivalente como se indica en la respuesta.
Muchas gracias. Esperaba que fuera lo suficientemente específico del contexto como para que la regla más consistente con Noda-Time fuera lo suficientemente buena, pero parece que la regla "el 1 del próximo mes" es un valor predeterminado más razonable. La implementación será muy simple: averiguar dónde documentarlo es más complicado;)
@yoni, lo busqué y tienes razón, depende de loshon bnei adam. El 30 de un año sería rosh jodesh el siguiente.
@JonSkeet también vale la pena señalar que cuando transcurre un año cuando comienzas desde Adar en debate (sorpresa sorpresa) si el próximo año es bisiesto. Para períodos de cálculos de luto o ceremonias de conmemoración, algunos considerarían que Adar I es el año siguiente, algunos solo esperarían a Adar II. Y hay más ejemplos de este tipo, por lo que no intentaría exponerlos todos a través de la API...
@synhershko: Definitivamente no voy a tratar de cubrir todos los diferentes contextos. Iré con el contexto de "cumpleaños" en este caso, ¡y lo documentaré en gran medida! (No debería ser demasiado difícil para los desarrolladores implementar diferentes enfoques si lo desean. Probablemente menos eficientes, pero está bien).

Tienes razón, para Adar I y Adar II el resultado de sumar un año generalmente será Adar II ya que el primer Adar (Adar I) es el que es el mes sumado.

En cuanto al día extra en un mes, generalmente todo se adelantaría un día. (30 Jeshván == 1 Kislev).

(Hay excepciones a esto, pero creo que, como regla general, cubre la mayoría de los casos para los que se utilizaría su calendario. Tal vez sería beneficioso agregar una sobrecarga para hacer un cálculo "tonto" al estilo de la implementación de Microsoft).

¡Hola HyShai! Bienvenido a Mi Yodeya, y muchas gracias por publicar esta respuesta. Su publicación será más valiosa si edita las fuentes para sus afirmaciones. Espero que busque en el sitio y encuentre otras publicaciones que valgan la pena, tal vez incluyendo nuestras otras 189 preguntas del calendario .