Преобразование в индуистский календарь и из него
Как я могу преобразовать unix
время в Индуистский календарь Википедия время и наоборот в php
, Perl
или Python
или Java
? Я знаю, что могу преобразовать в Hebrew
и Jewish
. Но Hindu
- это не вариант.
Если быть более точным, я говорю об индуистском лунном календаре. Следующий веб-сайт работает и делает именно то, что я хочу: http://web.meson.org/calendars /. Например, он "переводит" 28-1-2012
(григорианский) в 5-11-2068
(Хинд.Лунь.). Как я могу выполнить ту же задачу? И если там нет абсолютно никаких сценариев, как я могу написать это сам?
5 answers
Статья: Индийские календарные расчеты
Содержит общий код на лиспе в приложении.
В то время как решение на Python (или другом языке) может быть написано в соответствии с документом, авторы довольно хорошо перечисляют правила индийского календаря, так что это довольно солидная статья, если вы готовы рассмотреть возможность использования предоставленного общего кода Lisp.
Вы проверили DateTime-Indic-0.1 семейство модулей? По крайней мереДата и время::Индик::Чандрамана похоже, есть метод преобразования традиционной даты в значения UTC (utc_rd_values).
ОБНОВЛЕНИЕ:
Я полагаю, что Календарь::Сака может быть полезен также для многих пользователей (как я знаю, это индийский национальный календарь), в частности, методы to_gregorian()
и from_gregorian()
.
Для Python используйте calendar2 (примечание: это не встроенный модуль календаря).
Пример использования:
>>> 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)
Кажется, это трудная задача. Согласно это обсуждение на bytes.com нет четкого способа выполнить 100% правильное преобразование. Но, похоже, они ошибаются, когда предполагают, что в индуистском календаре всего 364 дня вместо 365 (или 366 в високосные годы).
Здесь вы можете найти хорошую таблицу пересчета, включая обработку високосных лет: http://hinduism.about.com/od/basics/a/monthsdayseras.htm
Если это так просто, как написано там, вы можете попробуйте что-то вроде этого (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);
?>
Вывод этого кода:
Date: 28-01-2012 (is leap year: yes)
Converted Hindu date: 07-11-2068
Но согласно калькулятору этого Java-апплета , он должен быть 05-11-2068 вместо 07-11-2068. Таким образом, все еще отсутствуют некоторые правила преобразования. Может быть, вы можете дать мне дополнительную информацию, чтобы я мог исправить приведенный выше код.
Я не знаю, правильный это подход или нет, но Пожалуйста, перейдите по ссылке http://calendarhome.com/converter / сайт и загрузите два файла javascript astro.js и calendar.js и следите за событиями григорианской даты и получайте параметры Гражданской даты Индии.