万年历计算 之 天干地支

上一篇 / 下一篇  2008-05-07 11:44:43

1、基本知识

 中国古代的一种纪年法。即以甲、乙、丙、丁、戊、己、庚、辛、壬、癸为十干,子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥为十二支,把干、支顺序配合。如甲子、乙丑等,经过六十年又回到甲子。周而复始,循环不已。我国农历现仍沿用干支纪年。
 
 本文中,我将计算公历某年某月某日某时的干支称为排四柱(该名称来源于传统的命理算卦)。
 
 本文中将现行公历和格里高利历理解为同一种历法。
 
 由于干支纪年法是以 60 年一轮回的周期,周而复始,循环不已。所以无法用某个单纯的公式计算,只能推算(仅本人看法),既然推算就必须有个起点,本文中已公历1583年1月1日为起点(儒略日1582年10月4日为格里高利日1582年10月15日)。通过查阅权威资料我们可知道,公历公历1583年1月1日的年、月、日干支为壬午年壬子月壬辰日。有了这个起点,再利用干支纪年的规律就好推算了。
 
 
2、日柱的计算

 日柱, 即日期用干支来表示。日柱的计算比较简单,说它简单是因为日柱的计算比较独立。需要注意的是,日柱的交界点为凌晨12点(普遍这么认为),此时刚好为子时(23:00 - 1:00),故将 23:00 - 24:00 称为初子时,意为今夜之子时,非明日之早。将 24:00 - 1:00 称为正子时,意为明日之早。业界普遍将日柱分界点定位初子时,意思就是说初子时算今天,正子时算明天。(呵呵,绕口的)
 
 首先,需要计算公历1583年1月1日至你要计算干支的公历日期(当天算在内)的相隔天数(由于这个比较容易这里就不罗列出代码了)。
 
 然后,我这里给出一个我自己推导出的简单 c 语言公式:
 
  // 天干
  int nHeavenlyStems = (相隔天数 % 10 +  8) % 10 - 1;
 
  // 地支
  int nEarthlyBranches = (相隔天数 % 12 +  4) % 12 - 1;
 
 接下来再简单修正一下:
 
  if(hour >=23 || hour == 0)
  {
   // 已初子时为界(第二天的开始)
   nHeavenlyStems++;
   nEarthlyBranches++;
  }
 
 nHeavenlyStems = (nHeavenlyStems == -1) ? 9 : nHeavenlyStems;
 结果为 0 - 9,依顺序分别代表 甲、乙、丙、丁、戊、己、庚、辛、壬、癸 十干
 
 nEarthlyBranches = (nEarthlyBranches == -1) ? 11 : nEarthlyBranches;
 结果为 0 - 11,依顺序分别代表 子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥 十二支
 
 注意:日柱交界点是以初子时为界
  
  
3、时柱的计算

 时柱, 即时辰用干支来表示。时柱的地支是确定的。古人将每 2 小时称为一个时辰,一天共 12 时辰,刚好对应 12 地支, 由凌晨1点开始每两小时对应于一地支,依次为:子丑寅...以下是对照表:
 
       子             丑             寅             卯              辰             己
    23-01       01-03      03-05       05-07      07-09        09-11

       午             未             申              酉             戊             亥
    11-13    13-15         15-17        17-19      19-21       21-23
   
 时柱的地支,这里我给出我自己推导出的简单 c 语言公式:
 
  // 地支
  int nEarthlyBranches = static_cast<int>(ceil(hour / 2.0));
  nEarthlyBranches = (nEarthlyBranches == 12) ? 0 : nEarthlyBranches;
  结果为 0 - 11,依顺序分别代表 子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥 十二支
 
 时柱的天干是不固定的,但可根据下面日上起时标推算时柱的天干(就是说时柱的天干和日干有关)
     
                 日上起时表
      
  时\日       甲己 乙庚 丙辛 丁壬 戊癸
  
  子            甲子 丙子 戊子 庚子 壬子
  丑            乙丑 丁丑 己丑 辛丑 癸丑
  寅            丙寅 戊寅 庚寅 壬寅 甲寅
  卯            丁卯 己卯 辛卯 癸卯 乙卯
  辰            戊辰 庚辰 壬辰 甲辰 丙辰
  巳            己巳 辛巳 癸巳 乙巳 丁巳
  午            庚午 壬午 甲午 丙午 戊午
  未            辛未 癸未 乙未 丁未 己未
  申            壬申 甲申 丙申 戊申 庚申
  酉            癸酉 乙酉 丁酉 己酉 辛酉
  戌            甲戌 丙戌 戊戌 庚戌 壬戌
  亥            乙亥 丁亥 己亥 辛亥 癸亥
  
 时柱的天干,这里我给出我自己根据上表推导出的简单 c 语言公式:
 
 首先,需要计算公历1583年1月1日至你要计算干支的公历日期(当天算在内)的相隔天数(由于这个比较容易这里就不罗列出代码了)。
 
  // 天干
  int nHeavenlyStems = (相隔天数 % 10 +  8) % 10 - 1);
  nHeavenlyStems = (nHeavenlyStems == -1) ? 9 : nHeavenlyStems;
  nHeavenlyStems = ((nHeavenlyStems % 5) * 2  + nEarthlyBranches) % 10;

 注意: 时柱地支是固定的,天干与日柱天干有关。
 
 
4、月柱的计算

 月柱,即月份用干支来表示。月柱的计算相对是最复杂的,因为月柱交界是以 24 节气中的节气(令)的时间为交界点的,所以要准确计算月柱首先必须有能力就算 24 节气的时间。(关于 24 节气的计算,不明白的朋友可以参考的另一篇文章万年历计算 之 节气
 
 首先,根据 24 节气的规律推导出该月所对应的节气(令),这里我给出我自己推导出的简单 c 语言公式:
 
  太阳黄经角度(节气) = month >= 4 ? 15 + (month - 4) * 30 : 270 + month * 15;
 
 其次,计算该节气的具体发生时间(参:万年历计算 之 节气), 如果采用我的节气就算方法,那么计算出来的节气时间为格林尼治时间(UTC),还需进一步转变为本地时间(LST)。
 
 再次,根据月柱的交界点条件,适当调整节气当地月份时间,公式如下:(monthLST,dayLST 为指定节气发生的本地时间)
  monthLST = (monthLST > month) || ((monthLST == month && dayLST > day)) ? month - 1 : month;
  
 最后,利用我自己推导出的简单 c 语言公式:
 
  // 天干
  int nHeavenlyStems = ((year - 1583) * 12 + monthLST + 12 - 4) % 10;
  结果为 0 - 9,依顺序分别代表 甲、乙、丙、丁、戊、己、庚、辛、壬、癸 十干
 
  // 地支
  int nEarthlyBranches = ((year - 1583) * 12 + monthLST + 12) % 12;
  结果为 0 - 11,依顺序分别代表 子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥 十二支
 
 注意: monthLST,dayLST 为指定节气发生的本地时间
   节气计算的结果为 UTC 时间,需要转换为 LST 时间
   月柱的交界点为 24 节气中的节气(也就是令)
 
 
5、年柱的计算

 年柱, 即年份用干支来表示。 需要注意的是,年柱的交界点(也就是上一年和下一年的分界线)是以立春这一天的交节时刻划分的,而不是已农历的正月初一。因此,会出现某一天有两种年柱的现象,月柱、日柱,时柱都需要注意这点(下面不再提及)。
 
 故
 首先,计算当年的立春时间(注意转换为本地时间)
 
 其次,根据年柱的交界点条件,适当调整节气的本地年份时间,公式如下:(yearLST,monthLST,dayLST 为指定节气发生的本地时间)
 
  yearLST = (st_month > month || ((st_month == month) && st_day > day)) ? yearLST - 1 : yearLST;
 
 
 最后,我这里给出一个我自己推导出的简单 c 语言公式:
 
  // 天干
  int nHeavenlyStems = (yearLST - 1583 + 36 - 7) % 10;
  结果为 0 - 9,依顺序分别代表 甲、乙、丙、丁、戊、己、庚、辛、壬、癸 十干
  
  // 地支
  int nEarthlyBranches = (yearLST - 1583 + 36 - 5) % 12;
  结果为 0 - 11,依顺序分别代表 子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥 十二支
 
  注意:year 代表你要计算年干支的那一公历年。
  年柱交界点为立春。


TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2008-11-30  
      1
2345678
9101112131415
16171819202122
23242526272829
30      

数据统计

  • 访问量: 1215
  • 日志数: 3
  • 建立时间: 2007-01-29
  • 更新时间: 2008-05-07

RSS订阅

Open Toolbar