|
用Perl写的。从阳历换算成干支纪年月日。
例:
- $ ./sexagenary.pl 2006/4/22
- 2006 年 4 月 22 日 <==> 丙戌 年 壬辰 月 戊寅 日
复制代码
源码:
- #!/usr/bin/perl
- my $date = shift || die "Useage: \n $0 yyyy/mm/dd\n";
- my ($y, $m, $d) = split(/\//, $date);
- die("Useage: \n $0 yyyy/mm/dd\n")
- unless (defined($y) && defined($m) && defined($d));
- my @gan = qw(甲 乙 丙 丁 戊 己 庚 辛 壬 癸);
- my @zhi = qw(子 丑 寅 卯 辰 巳 午 未 申 酉 戌 亥);
- my $yg, $yz, $mg, $mz, $dg, $dz;
- $yg = ($y-4)%10;
- $yz = ($y-4)%12;
- my $mm;
- if ($m == 1 || $m == 2) {$y--; $mm=$m+12;}
- my $c = ($y-($y%100))/100;
- my $yy = $y%100;
- my $i=0;
- if ($m%2 == 0) {$i=6;}
- $dg = 4*$c + ($c-$c%4)/4 + 5*$yy + ($yy-$yy%4)/4 + (3*($mm+1)-3*($mm+1)%5)/5+$d-3;
- $dz = 8*$c + ($c-$c%4)/4 + 5*$yy + ($yy-$yy%4)/4 + (3*($mm+1)-3*($mm+1)%5)/5+$d+7+$i;
- $dg = $dg%10-1;
- $dz = $dz%12-1;
- $mg = (($yg%5+1)*2)%10+($m+10)%12;
- $mz = $m%12;
- print("$y 年 $m 月 $d 日 <==> $gan[$yg]$zhi[$yz] 年 $gan[$mg]$zhi[$mz] 月 $gan[$dg]$zhi[$dz] 日\n");
- exit 0;
复制代码
计划改一下xfce的datetime plugin,使之显示农历,先用Perl试写,然后用C。可惜农历算法较复杂,还在学习中。这里干支年和月也是近似算的。真希望当年小学或中学数学课能教教历法。 |
|