Преобразование в и из индуистского календаря - PullRequest
44 голосов
/ 27 декабря 2011

Как я могу преобразовать unix время в Индуистский календарь & Википедия время и наоборот в php, Perl Python или Java? Я знаю, что могу конвертировать в Hebrew и Jewish. Но Hindu не вариант.

Если говорить более конкретно, я говорю об индуистском лунном календаре. Следующий веб-сайт работает и делает именно то, что я хочу: http://web.meson.org/calendars/. Например, он «переводит» 28-1-2012 (григорианский) в 5-11-2068 (хинд. Лун.). Как я могу выполнить ту же задачу? И если там нет абсолютно никаких писем, как я могу написать это сам?

Ответы [ 5 ]

17 голосов
/ 25 февраля 2012

Вы проверяли DateTime-Indic-0.1 семейство модулей? По крайней мере DateTime :: Indic :: Chandramana похоже, есть метод для преобразования традиционной даты в значения UTC (utc_rd_values).

UPDATE:

Полагаю, Calendar :: Saka может быть также полезен для многих пользователей (насколько я знаю, это индийский национальный календарь), в частности, методов to_gregorian() и from_gregorian().

11 голосов
/ 01 марта 2012

Для 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)
8 голосов
/ 02 марта 2012

Бумага: Индийские календарные расчеты
Содержит код Common Lisp в приложении.

Хотя решение Python (или другого языка) может быть написано в соответствии с документацией, авторы довольно хорошо перечисляют правила индийского календаря, так что это довольно солидная статья, если вы готовы рассмотреть возможность использования предоставленного кода Common Lisp.

5 голосов
/ 25 февраля 2012

Кажется, трудная задача.Согласно этому обсуждению на 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.Итак, некоторые правила конвертации все еще отсутствуют.Может быть, вы можете дать мне больше информации, чтобы я мог исправить код выше.

1 голос
/ 03 марта 2012

Я не знаю, правильный ли это подход или нет, но Перейдите на сайт http://calendarhome.com/converter/ и загрузите два файла javascript astro.js и calendar.js, следите за событиями обмена григорианской даты и получите параметры индийской гражданской даты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...