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:
Tengo una propuesta:
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));
}
}
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 addYears
método para tomar un boolean isBarMitzva
pará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.
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).
DanF
jon skeet
msh210
Caleb
msh210
jon skeet