java - historia - calendario hindu 2018
Convirtiendo hacia y desde el calendario hindú (5)
¿Cómo puedo convertir el tiempo de unix
al calendario hindú de Wikipedia y al revés en php
, Perl
o Python
o Java
? Sé que puedo convertirme al Hebrew
y al Jewish
. Pero Hindu
no es una opción.
Para ser más específico, estoy hablando del calendario lunar hindú. El siguiente sitio web funciona y hace exactamente lo que quiero: http://web.meson.org/calendars/ . Por ejemplo, ''traduce'' 28-1-2012
(gregoriano) al 5-11-2068
(Hind. Lun.). ¿Cómo puedo lograr la misma tarea? Y si no hay absolutamente ningún scrip, ¿cómo puedo escribirlo?
¿ DateTime-Indic-0.1 familia de módulos DateTime-Indic-0.1 ? Al menos DateTime :: Indic :: Chandramana parece tener un método para convertir la fecha tradicional en valores UTC (utc_rd_values).
ACTUALIZAR:
Supongo que Calendar :: Saka puede ser útil también para muchos usuarios (como ya he sabido, es el calendario nacional indio), en particular, para los to_gregorian()
y from_gregorian()
.
No sé si es el enfoque correcto o no, pero vaya al sitio http://calendarhome.com/converter/ y descargue dos archivos javascript astro.js y calendar.js, siga los eventos de cambio de fecha gregoriana y busque los parámetros de fecha civil india. .
Papel: Cálculos calendáricos indios
Proporciona el código Common Lisp en el apéndice.
Si bien una solución de Python (u otro idioma) se podría escribir de acuerdo con el documento, los autores enumeran las reglas del calendario indio bastante bien, por lo que es un documento bastante sólido si estás dispuesto a considerar tomar el código Common Lisp provisto.
Para Python, use calendar2 (nota: este no es el módulo de calendario incorporado).
Uso de muestra:
>>> from calendar2 import *
>>> old_hindu_solar_from_absolute(absolute_from_gregorian(3,1,2012))
(11, 16, 5112)
>>> old_hindu_lunar_from_absolute(absolute_from_gregorian(3,1,2012))
(12, 0, 8, 5112)
Parece ser una tarea difícil. De acuerdo con esta discusión en bytes.com, no hay una forma clara de lograr una conversión 100% correcta. Pero parece que están equivocados cuando suponen que el calendario hindú tiene solo 364 días en lugar de 365 (o 366 en años bisiestos).
Aquí puede encontrar una buena tabla de conversión que incluye el manejo de los años bisiestos: http://hinduism.about.com/od/basics/a/monthsdayseras.htm
Si es tan fácil como está escrito allí, puedes probar algo como esto (código php):
<?php
function convertDateToHinduDate($date) {
$beginningDayOfMonth = array(
1 => 21,
2 => 20,
3 => 22 + (dateIsLeapYear($date) ? -1 : 0), /* 21 in leap years */
4 => 21,
5 => 22,
6 => 22,
7 => 23,
8 => 23,
9 => 23,
10 => 23,
11 => 22,
12 => 22,
);
$daysOfHinduMonth = array(
1 => 30 + (dateIsLeapYear($date) ? 1 : 0), /* 31 in leap years */
2 => 31,
3 => 31,
4 => 31,
5 => 31,
6 => 31,
7 => 30,
8 => 30,
9 => 30,
10 => 30,
11 => 30,
12 => 30,
);
$day = (int) date(''d'', strtotime($date));
$month = (int) date(''m'', strtotime($date));
$year = (int) date(''Y'', strtotime($date));
$monthBefore = $day < $beginningDayOfMonth[$month];
$yearBefore = $month < 3 || ($month == 3 && $day < $beginningDayOfMonth[3]);
$newYear = $year + 57 + ($yearBefore ? -1 : 0);
$newMonth = $month - 2 + ($monthBefore ? -1 : 0);
if($newMonth < 1) $newMonth = 12 + $newMonth;
$newDay = $day - $beginningDayOfMonth[$month];
if($newDay < 1) $newDay = $daysOfHinduMonth[$newMonth] + $newDay;
return date("d-m-Y", mktime(11, 59, 0, $newMonth, $newDay, $newYear));
}
function dateIsLeapYear($date) {
return date(''L'', strtotime($date));
}
$date = date("d-m-Y", strtotime(''2012-01-28''));
echo ''Date: '', $date, '' (is leap year: '', dateIsLeapYear($date) ? ''yes'' : ''no'', '')<br />'';
echo ''Converted Hindu date: '', convertDateToHinduDate($date);
?>
Salida de este código:
Date: 28-01-2012 (is leap year: yes)
Converted Hindu date: 07-11-2068
Pero de acuerdo con la calculadora de http://web.meson.org/calendars/ , debería ser 05-11-2068 en lugar de 07-11-2068. Por lo tanto, todavía faltan algunas reglas de conversión. Quizás puedas darme más información para que pueda corregir el código anterior.