|
Server : Apache/2.4.62 System : FreeBSD fbsdweb2.web.rcn.net 14.1-RELEASE FreeBSD 14.1-RELEASE releng/14.1-n267679-10e31f0946d8 GENERIC amd64 User : www ( 80) PHP Version : 8.3.8 Disable Function : NONE Directory : /domains/mandarintools/cgi-bin/ |
Upload File : |
# -*- coding:utf-8 -*-
@monthnames = ("January", "February", "March", "April", "May", "June",
"July", "August", "September", "October", "November",
"December");
@daysofweek = ("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday",
"Saturday");
$yue = "月";
$ri = "日";
$run = "闰";
@calnumbers = ("零", "一", "二", "三", "四", "五", "六", "七", "八", "九", "十",
"十一", "十二", "十三", "十四", "十五", "十六", "十七", "十八", "十九", "廿",
"廿一", "廿二", "廿三", "廿四", "廿五", "廿六", "廿七", "廿八", "廿九", "卅",
"卅一");
@stems = ("7532", "4E59", "4E19", "4E01", "620A", "5DF1", "5E9A", "8F9B",
"58EC", "7678");
@stemsu8 = ("甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸");
@stempy = ("jia", "yi", "bing", "ding", "wu", "ji", "geng", "xin", "ren", "gui");
@branches = ("5B50", "4E11", "5BC5", "536F", "8FB0", "5DF3", "5348",
"672A", "7533", "9149", "620C", "4EA5");
@branchesu8 = ("子", "丑", "寅", "卯", "辰", "巳",
"午", "未", "申", "酉", "戌", "亥");
@branchpy = ("zi", "chou", "yin", "mao", "chen", "si",
"wu", "wei", "shen", "yu", "xu", "hai");
@signs = ("Rat", "Ox", "Tiger", "Rabbit", "Dragon", "Snake",
"Horse", "Sheep", "Monkey", "Chicken", "Dog", "Pig");
@signuni = ("9F20", "725B", "864E", "5154", "9F8D", "86C7",
"99AC", "7F8A", "7334", "96DE", "72D7", "8C6C");
@signu8 = ("鼠", "牛", "虎", "兔", "龙", "蛇",
"马", "羊", "猴", "鸡", "狗", "猪");
%months = (
"january" => 31,
"february" => 28,
"march" => 31,
"april" => 30,
"may" => 31,
"june" => 30,
"july" => 31,
"august" => 31,
"september" => 30,
"october" => 31,
"november" => 30,
"december" => 31
);
@months = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
%leapmonths = (
"january" => 31,
"february" => 29,
"march" => 31,
"april" => 30,
"may" => 31,
"june" => 30,
"july" => 31,
"august" => 31,
"september" => 30,
"october" => 31,
"november" => 30,
"december" => 31
);
@leapmonths = (31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
%daysofweek = (
"sunday" => 0,
"monday" => 1,
"tuesday" => 2,
"wednesday" => 3,
"thursday" => 4,
"friday" => 5,
"saturday" => 6
);
%yearstart = (
1 => "sunday",
2 => "monday",
3 => "tuesday",
4 => "wednesday",
5 => "thursday",
6 => "friday",
7 => "saturday",
8 => "sunday",
9 => "monday",
10 => "tuesday",
11 => "wednesday",
12 => "thursday",
13 => "friday",
14 => "saturday"
);
#print JGDate2Day(AD, 1, 1, 1), "\n";
# Finds the day of the week for a given date. Assumes
# dates before 1582 are Julian Calendar, after are Gregorian
sub JGDate2Day {
local($era, $year, $month, $day) = @_;
$month--;
if ($era eq "AD") {
if ($year > 1582) { # Gregorian Calendar
$yeartype = 7;
for ($i = 1583; $i < $year; $i++) {
#print "$i, $yeartype\n";
if (isGregorianleap($era, $i + 1)) {
$yeartype = ($yeartype % 7) + 8;
} else {
if ($yeartype == 13) {
$yeartype = 1;
} elsif ($yeartype > 7) {
$yeartype = ($yeartype % 7) + 2;
} else {
$yeartype = ($yeartype % 7) + 1;
}
}
}
#print $yeartype;
$julianday = 0;
for ($j = 0; $j < $month; $j++) {
$julianday += isGregorianleap($era, $year) ? $leapmonths[$j] : $months[$j];
}
$julianday += $day;
#print $julianday , "\n";
return $daysofweek[((($yeartype % 7) + $julianday - 1) % 7) - 1];
} elsif ($year < 1582) { # Julian Calendar
$yeartype = 7;
for ($i = 1; $i < $year; $i++) {
#print "$i, $yeartype\n";
if (isJulianleap($i + 1)) {
$yeartype = ($yeartype % 7) + 8;
} else {
if ($yeartype == 13) {
$yeartype = 1;
} elsif ($yeartype > 7) {
$yeartype = ($yeartype % 7) + 2;
} else {
$yeartype = ($yeartype % 7) + 1;
}
}
}
#print $yeartype;
$julianday = 0;
for ($j = 0; $j < $month; $j++) {
$julianday += isJulianleap($year) ? $leapmonths[$j] : $months[$j];
}
$julianday += $day;
#print $julianday , "\n";
return $daysofweek[((($yeartype % 7) + $julianday - 1) % 7) - 1];
} else { # 1582 AD, year of the switch
if ($month < 9) {
$yeartype = 2;
} elsif ($month == 9 and $day <= 4) {
$yeartype = 2;
} elsif ($month == 9 and $day >= 15) {
$yeartype = 6;
} elsif ($month == 9 and $day > 4 and $day < 15) {
return "Non-existent";
} else {
$yeartype = 6;
}
$julianday = 0;
for ($j = 0; $j < $month; $j++) {
$julianday += $months[$j];
}
$julianday += $day;
#print $julianday , "\n";
return $daysofweek[((($yeartype % 7) + $julianday - 1) % 7) - 1];
}
} else { # BC
}
}
#print "Gregorian " , GregorianDate2Day("BC", 1, 12, 31) , "\n";
# Find day of week for a given Gregorian date
sub GregorianDate2Day {
local($era, $year, $month, $day) = @_;
$month--;
if ($era eq "AD") {
$yeartype = 2;
for ($i = 1; $i < $year; $i++) {
#print "$i, $yeartype\n";
if (isGregorianleap($era, $i + 1)) {
$yeartype = ($yeartype % 7) + 8;
} else {
if ($yeartype == 13) {
$yeartype = 1;
} elsif ($yeartype > 7) {
$yeartype = ($yeartype % 7) + 2;
} else {
$yeartype = ($yeartype % 7) + 1;
}
}
}
#print $yeartype;
$julianday = 0;
for ($j = 0; $j < $month; $j++) {
$julianday += isGregorianleap($era, $year) ? $leapmonths[$j] : $months[$j];
}
$julianday += $day;
#print $julianday , "\n";
return $daysofweek[((($yeartype % 7) + $julianday - 1) % 7) - 1];
} else { # BC
$yeartype = 6;
for ($i = 4713; $i > $year; $i--) {
#print "$i, $yeartype\n";
if (isGregorianleap($era, $i + 1)) {
$yeartype = ($yeartype % 7) + 8;
} else {
if ($yeartype == 13) {
$yeartype = 1;
} elsif ($yeartype > 7) {
$yeartype = ($yeartype % 7) + 2;
} else {
$yeartype = ($yeartype % 7) + 1;
}
}
}
#print $yeartype;
$julianday = 0;
for ($j = 0; $j < $month; $j++) {
$julianday += isGregorianleap($era, $year) ? $leapmonths[$j] : $months[$j];
}
$julianday += $day;
#print $julianday , "\n";
return $daysofweek[((($yeartype % 7) + $julianday - 1) % 7) - 1];
}
}
#print "Julian ", JulianDate2Day("BC", 1, 12, 31) , "\n";
sub JulianDate2Day {
local($era, $year, $month, $day) = @_;
$month--;
if ($era eq "AD") {
$yeartype = 7;
for ($i = 1; $i < $year; $i++) {
#print "$i, $yeartype\n";
if (isJulianleap($i + 1)) {
$yeartype = ($yeartype % 7) + 8;
} else {
if ($yeartype == 13) {
$yeartype = 1;
} elsif ($yeartype > 7) {
$yeartype = ($yeartype % 7) + 2;
} else {
$yeartype = ($yeartype % 7) + 1;
}
}
}
#print $yeartype;
$julianday = 0;
for ($j = 0; $j < $month; $j++) {
$julianday += isJulianleap($year) ? $leapmonths[$j] : $months[$j];
}
$julianday += $day;
#print $julianday , "\n";
return $daysofweek[((($yeartype % 7) + $julianday - 1) % 7) - 1];
} else { # BC
$yeartype = 3;
for ($i = 4713; $i > $year; $i--) {
#print "$i, $yeartype\n";
if (isJulianleap($i + 1)) {
$yeartype = ($yeartype % 7) + 8;
} else {
if ($yeartype == 13) {
$yeartype = 1;
} elsif ($yeartype > 7) {
$yeartype = ($yeartype % 7) + 2;
} else {
$yeartype = ($yeartype % 7) + 1;
}
}
}
#print $yeartype;
$julianday = 0;
for ($j = 0; $j < $month; $j++) {
$julianday += isJulianleap($year) ? $leapmonths[$j] : $months[$j];
}
$julianday += $day;
#print $julianday , "\n";
return $daysofweek[((($yeartype % 7) + $julianday - 1) % 7) - 1];
}
}
# Returns true if year is a leap year under Gregorian calendar
sub isGregorianleap {
local($era, $year) = @_;
if ($era eq "AD") {
if (($year % 4) == 0) {
if (($year % 400) == 0) {
return 1;
} elsif (($year % 100) == 0) {
return 0;
} else {
return 1;
}
} else {
return 0;
}
} else {
if (($year % 4) == 1) {
if (($year % 400) == 1) {
return 1;
} elsif (($year % 100) == 1) {
return 0;
} else {
return 1;
}
} else {
return 0;
}
}
}
sub isJulianleap {
local($year) = @_;
if (($year % 4) == 0) {
return 1;
} else {
return 0;
}
}
sub isJulianPerleap {
local($era, $year) = @_;
if ($era eq "AD") {
if (($year % 4) == 0) {
return 1;
} else {
return 0;
}
} elsif ($era eq "BC") {
if (($year % 4) == 1) {
return 1;
} else {
return 0;
}
}
}
# Julian2Gregorian("AD", 1582, 10, 5);
sub Julian2Gregorian {
local($era, $year, $month, $day) = @_;
if ($era eq "BC") {
$offset = - (ceiling(int(($year - 1) / 100) * .75) + 2);
if ($year % 100 == 1 and $year % 400 != 1) { # leap year discrepancy
$offset = - $offset;
($era2, $year2, $month2, $day2) = date_minus_days($era, $year, $month, $day, "Julian", $offset);
if ($month2 <= 2) {
($era2, $year2, $month2, $day2) = date_minus_days($era, $year, $month, $day, "Julian", 1);
}
return ($era2, $year2, $month2, $day2);
} else { # leap years will match
if ($offset >= 0) {
date_plus_days($era, $year, $month, $day, "Julian", $offset);
} else {
$offset = - $offset;
date_minus_days($era, $year, $month, $day, "Julian", $offset);
}
}
} else {
$offset = ceiling((int $year / 100) * .75) - 2;
if ($offset % 100 == 0 and $offset % 400 != 0) {
if ($offset >= 0) {
($era2, $year2, $month2, $day2) = date_plus_days($era, $year, $month, $day, "Julian", $offset);
if ($month2 <= 2) {
($era2, $year2, $month2, $day2) = date_minus_days($era, $year, $month, $day, "Julian", 1);
}
return ($era2, $year2, $month2, $day2);
} else {
$offset = - $offset;
($era2, $year2, $month2, $day2) = date_minus_days($era, $year, $month, $day, "Julian", $offset);
if ($month2 <= 2) {
($era2, $year2, $month2, $day2) = date_minus_days($era, $year, $month, $day, "Julian", 1);
}
return ($era2, $year2, $month2, $day2);
}
} else {
if ($offset >= 0) {
date_plus_days($era, $year, $month, $day, "Julian", $offset);
} else {
$offset = - $offset;
date_minus_days($era, $year, $month, $day, "Julian", $offset);
}
}
}
}
# Gregorian2Julian("AD", 1582, 10, 15);
sub Gregorian2Julian {
local($era, $year, $month, $day) = @_;
if ($era eq "BC") {
$offset = - (ceiling(int(($year - 1) / 100) * .75) + 2);
if ((($year - 1) % 100 == 0) and (($year - 1) % 400 != 0)) {
$offset = - $offset;
($era2, $year2, $month2, $day2) = date_plus_days($era, $year, $month, $day, "Julian", $offset);
if ($month2 <= 2) {
($era2, $year2, $month2, $day2) = date_plus_days($era, $year, $month, $day, "Julian", 1);
}
return ($era2, $year2, $month2, $day2);
} else {
if ($offset >= 0) {
date_minus_days($era, $year, $month, $day, "Julian", $offset);
} else {
$offset = - $offset;
date_plus_days($era, $year, $month, $day, "Julian", $offset);
}
}
} else { # A.D.
$offset = ceiling((int $year / 100) * .75) - 2;
if ($offset % 100 == 0 and $offset % 400 != 0) {
if ($offset >= 0) {
($era2, $year2, $month2, $day2) = date_minus_days($era, $year, $month, $day, "Julian", $offset);
if ($month2 <= 2) {
($era2, $year2, $month2, $day2) = date_plus_days($era, $year, $month, $day, "Julian", 1);
}
return ($era2, $year2, $month2, $day2);
} else {
$offset = - $offset;
($era2, $year2, $month2, $day2) = date_plus_days($era, $year, $month, $day, "Julian", $offset);
if ($month2 <= 2) {
($era2, $year2, $month2, $day2) = date_plus_days($era, $year, $month, $day, "Julian", 1);
}
return ($era2, $year2, $month2, $day2);
}
} else {
if ($offset >= 0) {
($era2, $year2, $month2, $day2) = date_minus_days($era, $year, $month, $day, "Julian", $offset);
} else {
$offset = - $offset;
($era2, $year2, $month2, $day2) = date_plus_days($era, $year, $month, $day, "Julian", $offset);
}
return ($era2, $year2, $month2, $day2);
}
}
}
sub isValidJulian {
}
sub isValidGregorian {
}
# Converts a date to a Julian Day number, assumes
# date is from Julian Calendar so Gregorian
# dates must be converted to Julian first
sub JulianPeriod { # Day 1: Jan. 1, 4713 BC
local($era, $year, $month, $day) = @_;
$month--;
if ($era eq "BC") {
$yearstart = 1;
$julianyear = 1;
$juliandate = -1;
for ($i = 4713; $i > $year; $i--) {
if (isJulianPerleap($era, $i)) {
$juliandate += 366;
} else {
$juliandate += 365;
}
}
for ($j = 0; $j < $month; $j++) {
$juliandate += isJulianPerleap($era, $year) ? $leapmonths[$j] : $months[$j];
}
$juliandate += $day;
# print $juliandate . " Julian date\n";
return $juliandate;
} else {
$yearstart = 1;
$julianyear = 1;
$juliandate = -1;
for ($i = 4713; $i >= 1; $i--) {
if (isJulianPerleap("BC", $i)) {
$juliandate += 366;
} else {
$juliandate += 365;
}
$julianyear++;
}
for ($i = 1; $i < $year; $i++) {
if (isJulianleap($i)) {
$juliandate += 366;
} else {
$juliandate += 365;
}
$julianyear++;
}
for ($j = 0; $j < $month; $j++) {
$juliandate += isJulianPerleap("AD", $year) ? $leapmonths[$j] : $months[$j];
}
$juliandate += $day;
# print $juliandate . ": Julian date\n";
return $juliandate;
}
}
sub JulianPeriod2Julian {
local($jd) = @_;
$jd++; # life is easier starting from 1
$year = 4713;
$era = "BC";
$yearlen = 366;
while ($jd > $yearlen) {
$jd -= $yearlen;
if ($era eq "BC") {
if ($year == 1) {
$era = "AD";
} else {
$year--;
}
} else {
$year++;
}
$yearlen = isJulianPerleap($era, $year) ? 366 : 365;
}
$month = 0;
$monthlen = 31;
while ($jd > $monthlen) {
$jd -= $monthlen;
$month++;
$monthlen = isJulianPerleap($era, $year) ? $leapmonths[$month] : $months[$month];
}
$day = $jd;
return ($era, $year, ++$month, $day);
}
# print &date_plus_days("BC", 1369, 2, 27, "Julian", 30) , "\n";
sub date_plus_days {
local($era, $year, $month, $day, $caltype, $adddays) = @_;
$month--;
for ($i = 0; $i < $adddays; $i++) {
if ($caltype eq "Julian") {
$leap = isJulianPerleap($era, $year);
} else {
$leap = isGregorianleap($era, $year);
}
if (($day + 1) > ($leap ? $leapmonths[$month] : $months[$month])) {
$day = 1;
if (($month + 1) == 12) {
$month = 0;
if ($era eq "BC") {
if ($year == 1) {
$era = "AD";
} else {
$year--;
}
} else {
$year++;
}
} else {
$month++;
}
} else {
$day++;
}
}
# print "$monthnames[$month] $day, $year $era\n";
return ($era, $year, ++$month, $day);
}
#date_minus_days("AD", 1996, 10, 5, "Gregorian", 350);
sub date_minus_days {
local($era, $year, $month, $day, $caltype, $subdays) = @_;
$month--;
for ($i = 0; $i < $subdays; $i++) {
# print "Sub-days $month $day <BR> \n";
if ($caltype eq "Julian") {
$leap = isJulianPerleap($era, $year);
} else {
$leap = isGregorianleap($era, $year);
}
if ($day == 1) {
if ($month == 0) {
$month = 11;
$day = 31;
if ($era eq "AD") {
if ($year == 1) {
$era = "BC";
} else {
$year--;
}
} else {
$year++;
}
} else {
$month--;
$day = $leap ? $leapmonths[$month] : $months[$month];
}
} else {
$day--;
}
}
# print "$monthnames[$month] $day, $year $era\n";
return ($era, $year, ++$month, $day);
}
sub ceiling {
local($number) = @_;
if ((int $number) != $number) {
return (int $number + 1);
} else {
return $number;
}
}
#cyclical_year("AD", 1944, 3, 3);
sub cyclical_year {
($era, $year, $month, $day) = @_;
if ($era eq "BC") {
$cyears = 2697 - $year;
} else {
$cyears = 2696 + $year
}
$stem = $cyears % 10;
$branch = $cyears % 12;
# print "$stem, $branch\n";
return ($stem, $branch);
}
#($era, $year, $month, $day) = Gregorian2Julian("AD", 1804, 3, 12);
#cyclical_day($era, $year, $month, $day);
sub cyclical_day {
($era, $year, $month, $day) = @_;
$julian_day = JulianPeriod($era, $year, $month, $day);
#print "$julian_day julian_day\n";
$cyc_index = ($julian_day - 11) % 60;
# print $cyc_index , " cyc\n";
$stem = $cyc_index % 10;
$branch = $cyc_index % 12;
# print "$stem, $branch\n";
return ($stem, $branch);
}
sub julian_day_to_chinese {
local($jd) = @_;
open(INDEXFD, "calinfo/calindex") or die "Can't open $!";
while (<INDEXFD>) {
@indices = split(/\t/);
if ($jd >= $indices[0] and $jd < $indices[1]) {
$dynasty = $indices[2];
last;
}
}
close(INDEXFD);
if ($dynasty eq "") {
print "Outside of presently supported ranges.<BR>\n";
return "";
}
open(DFD, "calinfo/$dynasty");
$initline = <DFD>;
($curdynastyjd, $curdynasty, $curruler, $curreign_title, $curreign_year, $curyear, $curmonthtype, $curmonthcycle, $comment) = split(/\t/, $initline);
while (<DFD>) {
($dynastyjd, $dynasty, $ruler, $reign_title, $reignyear, $year, $monthtype, $monthcycle, $comment) = split(/\t/);
if ($jd < $dynastyjd) {
$curday = $jd - $curdynastyjd + 1;
return ($curdynasty, $curruler, $curreign_title, $curreign_year, $curyear, $curmonthtype, $curmonthcycle, $curday);
}
$curdynastyjd = $dynastyjd;
if ($dynasty ne "#") {$curdynasty = $dynasty;}
if ($ruler ne "#") {$curruler = $ruler;}
if ($reign_title ne "#") {$curreign_title = $reign_title;}
$curmonthtype = $monthtype;
if ($monthtype eq "1") {
$curreign_year++;
$curyear = ($curyear % 60) + 1;
$curmonthcycle = ($curmonthcycle % 60) + 1;
} elsif ($monthtype eq "L") {
# don't advance monthcycle
} else {
$curmonthcycle = ($curmonthcycle % 60) + 1;
}
if ($reignyear ne "#") { $curreign_year = $reignyear; }
}
close(DFD);
}
1;