转换为印度教日历

时间:2011-12-27 14:53:25

标签: java php python perl calendar

如何将unix时间转换为Hindu calendar­Wikipedia时间,反之亦然phpPerlPythonJava?我知道我可以转换为HebrewJewish。但Hindu不是一种选择。

更具体地说,我在谈论印度教的农历。以下网站正在运作,正是我想要的:http://web.meson.org/calendars/。例如,它将'28-1-2012(格里高利)翻译为5-11-2068(后来。伦。)。我怎样才能完成同样的任务?如果那里绝对没有抄写,我怎么能自己写呢?

5 个答案:

答案 0 :(得分:17)

您是否检查了DateTime-Indic-0.1系列模块?至少3个}} 似乎有一种方法可以将传统日期转换为UTC值(utc_rd_values)。

<强>更新

我认为DateTime::Indic::Chandramana对许多用户也是有用的(正如我所知,它是印度国家日历),特别是to_gregorian()from_gregorian()方法。

答案 1 :(得分:11)

对于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)

答案 2 :(得分:8)

论文:Indian Calendrical Calculations
在附录中提供Common Lisp代码。

虽然可以根据论文编写Python(或其他语言)解决方案,但作者很好地列举了印度日历规则,因此如果您愿意考虑使用提供的Common Lisp代码,那么这是一篇非常可靠的论文。

答案 3 :(得分:5)

似乎是一项艰巨的任务。根据{{​​3}},没有明确的方法可以实现100%正确的转换。但是,当他们认为印​​度教日历只有364天而不是365天(或闰年366天)时,他们似乎错了。

在这里,您可以找到一个好的转换表,包括闰年的处理:this discussion at bytes.com

如果它像写在那里一样容易,你可以试试这样的东西(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

但根据http://hinduism.about.com/od/basics/a/monthsdayseras.htm的计算器,它应该是05-11-2068而不是07-11-2068。因此,仍然缺少一些转换规则。也许你可以给我一些更多的信息,以便我可以纠正上面的代码。

答案 4 :(得分:1)

我不知道这是否是正确的方法但是 请转到http://calendarhome.com/converter/站点并下载两个javascript文件astro.js和calendar.js,然后按照Gregorian Date的onchange事件并获取Indian Civil Date参数。