LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1816|回复: 2

阳历换算干支纪年月日

[复制链接]
发表于 2006-4-23 11:44:53 | 显示全部楼层 |阅读模式
用Perl写的。从阳历换算成干支纪年月日。

例:

  1. $ ./sexagenary.pl 2006/4/22
  2. 2006 年 4 月 22 日 <==> 丙戌 年 壬辰 月 戊寅 日
复制代码


源码:
  1. #!/usr/bin/perl

  2. my $date = shift || die "Useage: \n  $0 yyyy/mm/dd\n";
  3. my ($y, $m, $d) = split(/\//, $date);
  4. die("Useage: \n  $0 yyyy/mm/dd\n")
  5.   unless (defined($y) && defined($m) && defined($d));

  6. my @gan = qw(甲 乙 丙 丁 戊 己 庚 辛 壬 癸);
  7. my @zhi = qw(子 丑 寅 卯 辰 巳 午 未 申 酉 戌 亥);

  8. my $yg, $yz, $mg, $mz, $dg, $dz;
  9. $yg = ($y-4)%10;
  10. $yz = ($y-4)%12;

  11. my $mm;
  12. if ($m == 1 || $m == 2) {$y--; $mm=$m+12;}
  13. my $c = ($y-($y%100))/100;
  14. my $yy = $y%100;
  15. my $i=0;
  16. if ($m%2 == 0) {$i=6;}
  17. $dg = 4*$c + ($c-$c%4)/4 + 5*$yy + ($yy-$yy%4)/4 + (3*($mm+1)-3*($mm+1)%5)/5+$d-3;
  18. $dz = 8*$c + ($c-$c%4)/4 + 5*$yy + ($yy-$yy%4)/4 + (3*($mm+1)-3*($mm+1)%5)/5+$d+7+$i;
  19. $dg = $dg%10-1;
  20. $dz = $dz%12-1;

  21. $mg = (($yg%5+1)*2)%10+($m+10)%12;
  22. $mz = $m%12;

  23. print("$y 年 $m 月 $d 日 <==> $gan[$yg]$zhi[$yz] 年 $gan[$mg]$zhi[$mz] 月 $gan[$dg]$zhi[$dz] 日\n");

  24. exit 0;
复制代码


计划改一下xfce的datetime plugin,使之显示农历,先用Perl试写,然后用C。可惜农历算法较复杂,还在学习中。这里干支年和月也是近似算的。真希望当年小学或中学数学课能教教历法。
发表于 2006-4-23 12:52:07 | 显示全部楼层
生来自由:
   能告诉我那儿能找到这些资料吗?
   谢谢。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-4-23 13:15:00 | 显示全部楼层
google上搜索“干支纪年”就有很多材料。
个人参考是维基百科的“干支”条目(http://zh.wikipedia.org/wiki/%E5%B9%B2%E6%94%AF%E7%BA%AA%E5%B9%B4)。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表