2011-12-27 9 views
43

Come posso convertire unix tempo per Hindu calendar­Wikipedia tempo e viceversa in php, Perl o Python o Java? So che posso convertire in Hebrew e Jewish. Ma Hindu non è un'opzione.Convertire da e verso calendario indù

Per essere più specifici, sto parlando del calendario lunare indù. Il seguente sito Web funziona e fa esattamente ciò che voglio: http://web.meson.org/calendars/. Ad esempio, "traduce" 28-1-2012 (gregoriano) a 5-11-2068 (Hind. Lun.). Come posso realizzare lo stesso compito? E se non ci sono assolutamente script in giro, come posso scriverlo da solo?

+0

Si prega di fornire valori di esempio come si dovrebbe esprimere una data (timestamp) quando lo si scrive * calendario indù *-stile. – hakre

+0

Da giorno, mese, anno per giorno, mese, anno è sufficiente per la nostra applicazione. –

+1

Non è quello che volevo sapere. Basta dare più esempi, data indù a sinistra, la data gregoriana sulla destra. Voglio solo sapere che cosa è quel calendario indù quando i valori della data sono espressi su un sito web. – hakre

risposta

8

carta: Indian Calendrical Calculations
fornisce il codice Common Lisp in appendice.

Mentre una soluzione Python (o un'altra lingua) potrebbe essere scritta in base al documento, gli autori elencano piuttosto bene le regole del calendario indiano, quindi è un documento piuttosto solido se si è disposti a prendere in considerazione il codice Common Lisp fornito. .

+0

Ottimo! Penso che con l'aiuto di questo documento dovrebbe essere possibile implementare la conversione del calendario. – Alp

+0

Giusto notare che quasi tutte le implementazioni, inclusa quella in Python che ho postato e quella che hai inizialmente menzionato nella tua domanda, usano il codice derivato dai frammenti Lisp di quel foglio. –

17

Hai controllato la famiglia di moduli DateTime-Indic-0.1? Almeno DateTime::Indic::Chandramana sembra avere un metodo per convertire la data tradizionale in valori UTC (utc_rd_values).

UPDATE:

suppongo Calendar::Saka può essere utile anche per molti utenti (come ho conosciuto, è il calendario nazionale indiano), in particolare, to_gregorian() e from_gregorian() metodi.

+0

Grazie, come posso installarlo? Ho installato CPAN e ora ho provato a fare 'perl Makefile.PL', ma dà errori come' Attenzione: prerequisito DateTime :: Event :: Lunar 0.06 non trovato. –

+0

E cosa fa 'cpan install DateTime :: Event :: Lunar "Ti dico, scusa? – raina77ow

+0

Che mancano alcune altre dipendenze. Sto cercando di installarli ora. –

5

Sembra essere un compito difficile. Secondo this discussion at bytes.com non esiste un modo chiaro per realizzare una conversione corretta al 100%. Ma sembra che abbiano torto quando pensano che il calendario indù abbia solo 364 giorni invece di 365 (o 366 anni bisestili).

Qui è possibile trovare una buona tabella di conversione compresa la gestione degli anni bisestili: http://hinduism.about.com/od/basics/a/monthsdayseras.htm

Se è così facile come scritto lì si può provare qualcosa di simile (codice 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); 
?> 

uscita di questo codice:

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

Ma secondo la calcolatrice di this Java applet, dovrebbe essere 2068/05/11 anziché 2068/07/11. Quindi, mancano ancora alcune regole di conversione. Forse puoi darmi qualche altra informazione in modo da poter correggere il codice qui sopra.

11

Per Python, utilizzare calendar2 (nota: questo non è il modulo calendario incorporato).

uso Esempio:

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

io non so se sia l'approccio corretto o meno, ma vai al sito http://calendarhome.com/converter/ e scarica due file javascript astro.js e calendar.js e seguire OnChange eventi di Gregorian Data a prendere indiani parametri civile Data.

Problemi correlati