Converting to and from Hindu calendar

How can I convert unix time to Hindu calendar­Wikipedia time and the other way round in php, Perl or Python or Java? I know I can convert to Hebrew and Jewish. But Hindu is not an option.

To be more specific, I'm talking about the Hindu lunar calendar. The following website is working and does exactly what I want: http://web.meson.org/calendars/. For example, it 'translates' 28-1-2012 (Gregorian) to 5-11-2068 (Hind. Lun.). How can I accomplish the same task? And if there are absolutely no scrips out there, how can I write it myself?


Solution 1:

Did you check DateTime-Indic-0.1 family of modules? At least DateTime::Indic::Chandramana seems to have a method to convert traditional date into UTC values (utc_rd_values).

UPDATE:

I suppose Calendar::Saka may be useful as well for many users (as I have known, it's the Indian national calendar), in particular, to_gregorian() and from_gregorian() methods.

Solution 2:

For Python, use calendar2 (note: this is not the built-in calendar module).

Sample use:

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

Solution 3:

Paper: Indian Calendrical Calculations
Provides Common Lisp code in the appendix.

While a Python (or other language) solution could be written according to the paper, the authors enumerate the Indian calendar rules pretty well, so it's a pretty solid paper if you're willing to consider taking the provided Common Lisp code.

Solution 4:

Seems to be a difficult task. According to this discussion at bytes.com there is no clear way to accomplish a 100% correct conversion. But it seems that they are wrong when they assume that the Hindu calendar has only 364 days instead of 365 (or 366 in leap years).

Here you can find a good conversion table including the handling of leap years: http://hinduism.about.com/od/basics/a/monthsdayseras.htm

If it is as easy as written there you can try something like this (php code):

<?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);
?>

Output of this code:

Date: 28-01-2012 (is leap year: yes)
Converted Hindu date: 07-11-2068

But according to the calculator of this Java applet, it should be 05-11-2068 instead of 07-11-2068. So, there are still some conversion rules missing. Maybe you can give me some more information so that i can correct the code above.