Converting to and from Hindu calendar

Question:

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?

Answers:

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.

Answered By: raina77ow

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.

Answered By: Alp

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)
Answered By: Burhan Khalid

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.

Answered By: Prashant Kumar

I dont know whether it is correct approach or not but
Please go to http://calendarhome.com/converter/ site and download two javascript files astro.js and calendar.js and follow onchange events of Gregorian Date and fetch Indian Civil Date parameters.

Answered By: Avinash
Categories: questions Tags: , , , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.