2011-12-27 39 views
43

Làm thế nào tôi có thể chuyển đổi unix thời gian để Hindu calendar­Wikipedia thời gian và chiều ngược lại trong php, Perl hoặc Python hoặc Java? Tôi biết tôi có thể chuyển đổi thành HebrewJewish. Nhưng Hindu không phải là một lựa chọn.Chuyển đổi sang và từ lịch Hindu

Để cụ thể hơn, tôi đang nói về lịch âm Hindu. Trang web sau đang hoạt động và thực hiện chính xác những gì tôi muốn: http://web.meson.org/calendars/. Ví dụ: nó 'dịch' 28-1-2012 (Gregorian) thành 5-11-2068 (Hind. Lun.). Làm thế nào tôi có thể hoàn thành nhiệm vụ tương tự? Và nếu có hoàn toàn không có scrips ra khỏi đó, làm thế nào tôi có thể viết nó bản thân mình?

+0

Vui lòng cung cấp các giá trị mẫu làm cách nào bạn thể hiện ngày (dấu thời gian) khi bạn viết ngày * kiểu lịch Hindu *. – hakre

+0

Từ ngày, tháng, năm này sang ngày khác, tháng, năm là đủ cho ứng dụng của chúng tôi. –

+1

Đó không phải là điều tôi muốn biết. Chỉ cần đưa ra nhiều ví dụ, ngày hindu ở bên trái, theo ngày gregorian bên phải. Tôi chỉ muốn biết lịch hindu đó là gì khi các giá trị ngày tháng được thể hiện trên một trang web. – hakre

Trả lời

8

Giấy: Indian Calendrical Calculations
cung cấp mã Lisp thường gặp ở phụ lục.

Trong khi một giải pháp Python (hoặc ngôn ngữ khác) có thể được viết theo giấy, các tác giả liệt kê các quy tắc lịch Ấn Độ khá tốt, vì vậy nó là một giấy khá vững chắc nếu bạn sẵn sàng cân nhắc việc sử dụng mã Lisp thường được cung cấp .

+0

Tuyệt vời! Tôi nghĩ với sự trợ giúp của bài báo này, có thể thực hiện việc chuyển đổi lịch. – Alp

+0

Chỉ cần lưu ý rằng hầu như tất cả các triển khai - bao gồm cả một trong Python mà tôi đã đăng và cái bạn đã đề cập ban đầu trong câu hỏi của bạn sử dụng mã bắt nguồn từ đoạn trích Lisp từ bài báo đó. –

17

Bạn đã kiểm tra DateTime-Indic-0.1 họ mô-đun chưa? Ít nhất DateTime::Indic::Chandramana dường như có phương pháp chuyển đổi ngày truyền thống thành giá trị UTC (utc_rd_values).

UPDATE:

Tôi cho rằng Calendar::Saka có thể hữu ích cũng cho nhiều người dùng (như tôi đã được biết đến, đó là lịch quốc gia Ấn Độ), đặc biệt là to_gregorian()from_gregorian() phương pháp.

+0

Cảm ơn, tôi có thể cài đặt cái này bằng cách nào? Tôi đã cài đặt CPAN và bây giờ đã cố gắng làm 'perl Makefile.PL', nhưng nó đưa ra các lỗi như' Cảnh báo: điều kiện tiên quyết DateTime :: Sự kiện :: Không tìm thấy Lunar 0.06.' –

+0

Và 'cpan install DateTime :: Event :: Lunar là gì 'nói với bạn, xin lỗi? – raina77ow

+0

Một số phụ thuộc khác bị thiếu. Tôi đang cố cài đặt chúng ngay bây giờ. –

5

Có vẻ là một nhiệm vụ khó khăn. Theo số this discussion at bytes.com, không có cách nào rõ ràng để thực hiện chuyển đổi chính xác 100%. Nhưng có vẻ như họ sai khi họ cho rằng lịch Hindu chỉ có 364 ngày thay vì 365 (hoặc 366 năm nhuận).

đây bạn có thể tìm thấy một bảng chuyển đổi tốt bao gồm cả việc xử lý năm nhuận: http://hinduism.about.com/od/basics/a/monthsdayseras.htm

Nếu đó là dễ dàng như viết đó bạn có thể thử một cái gì đó như thế này (mã 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); 
?> 

đầu ra của mã này:

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

Tuy nhiên, theo tính của this Java applet, nó phải là 2068/05/11 thay vì 2068/07/11. Vì vậy, vẫn còn một số quy tắc chuyển đổi bị thiếu. Có lẽ bạn có thể cho tôi thêm một số thông tin để tôi có thể sửa mã ở trên.

11

Đối với Python, sử dụng calendar2 (lưu ý: đây không phải là mô đun lịch được tích hợp sẵn).

sử dụng mẫu:

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

Tôi không biết liệu đó có phải là cách tiếp cận chính xác hay không, nhưng Vui lòng truy cập trang web http://calendarhome.com/converter/ và tải xuống hai tệp javascript astro.js và calendar.js và theo dõi sự kiện onchange của Gregorian Date.

Các vấn đề liên quan