Como tiene el control de la interfaz de entrada, sin pérdida de generalidad podemos suponer que habrá un año/mes/día por separado enteros (validar correctamente para ... ser entero :). Digamos que ese año será negativo para indicar BC.
Ante todo ... la respuesta obvia (parcial): checkdate(). Esto está bien para años> = 1, como dice la documentación de la función.
que estés atascado por lo tanto, el problema de qué hacer si el año < = 0.
Hagamos un side-trek aquí y ver por qué puede ser un gran problema ...
De acuerdo con la Enlace de Wikipedia arriba, el calendario juliano entró en vigor en el año 45 a. Este calendario es, para todos los propósitos prácticos, idéntico al calendario gregoriano que usamos hoy. La diferencia es que hay una compensación de diez días entre ellos; el último día del calendario juliano fue el jueves 4 de octubre de 1582, y fue seguido por el primer día del calendario gregoriano, el viernes 15 de octubre de 1582 (el ciclo de los días de la semana no se vio afectado).
Esto ya significa que las fechas en el rango del 5 de octubre de 1582 al 14 de octubre de 1582 (inclusive) no son válidas si está siguiendo el calendario gregoriano; ellos nunca han existido
Yendo hacia atrás desde allí, estás bien hasta el 45 aC. Desde el 46 aC hacia atrás, se usó el Roman calendar en lugar del Julian.
No voy a entrar en ese lío aquí, pero simplemente menciono que dado que ese calendario era bastante diferente al gregoriano, sus usuarios no estarán preparados para ver un "formulario de entrada de fecha del calendario romano". Mi sugerencia es, mejor hacer que su aplicación sea utilizable que técnicamente correcta.
Si se puede suponer que nadie en su sano juicio conocería realmente una fecha de BC al día, o sabe cómo especificarla adecuadamente incluso si lo hicieran, puede suponer arbitrariamente que todas las fechas BC son de la forma 1 /1 AÑO. Por lo tanto, su interfaz puede desactivar los controles de mes/día si se marcó una casilla de verificación "BC", tiene cuadros de grupo separados para BC y AD, o cualquier otra cosa apropiada.
El único problema restante después de todo esto, según lo veo, es verificar fechas para años bisiestos. Esos fueron introduced with the Julian calendar, but not actually implemented correctly until 8 AD.
El último enlace arriba documenta que durante 45 BC - 4 años bis (inclusive) años bisiestos no se calcularon correctamente. A es año bisiesto función que da cuenta de que la inconsistencia, más el/interruptor gregoriano Julian sería:
define('YEAR_JULIAN_CALENDAR_INTRODUCED', -45);
define('YEAR_JULIAN_CALENDAR_LEAP_IMPLEMENTED_CORRECTLY', 8);
define('YEAR_GREGORIAN_CALENDAR_INTRODUCED', 1582);
function is_leap_year($year) {
if($year < YEAR_JULIAN_CALENDAR_INTRODUCED) {
return false; // or good luck :)
}
if($year < YEAR_JULIAN_CALENDAR_LEAP_IMPLEMENTED_CORRECTLY) {
return $year <= -9 && $year % 3 == 0;
}
if($year < YEAR_GREGORIAN_CALENDAR_INTRODUCED) {
return $year % 4 == 0;
}
// Otherwise, Gregorian is in effect
return $year % 4 == 0 && ($year % 100 != 0 || $year % 400 == 0);
}
Armado con esto, se podía entonces escribe una función que le indica correctamente el número de días que hay en cada año. La substracción/adición de fecha podría entonces construirse sobre eso.
Después de toda esta discusión (Admiro el coraje de cualquiera que haya leído hasta aquí :) Tengo que preguntar:
¿Cuánto exactitud lo que realmente necesita?
Si decide que debe analizar los "detalles técnicos", implementaría personalmente las funciones mencionadas anteriormente, y luego: a) Utilícelas como mi biblioteca de fechas artesanal, o b) Utilícelas para verificar que cualquier biblioteca de terceros que me interese se haya implementado correctamente.
Si no tiene que hacer eso, pretenda que nunca ha leído todo esto. :)
¿Cuál será el formato de entrada de fecha? La respuesta dependería mucho de eso. :) – Jon
Estoy abierto para recibir sugerencias. No estoy seguro de si tendré una serie de menús desplegables con un adicional que tenga "B.C./A.D". o un simple cuadro de texto. – Sampson
Vea mi larga respuesta a continuación; para resumir, los botones de radio para BC/AD suenan como los más apropiados para mí. – Jon