首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

中國農曆算法 Java 實現:1901-2100 年 200 年精準曆法引擎

     編輯:Java 相關知識

核心設計思路

  • 基準日錨定:公曆 1901-01-01 ⇔ 農曆 4598 年 11 月 11 日;另設 2000-01-01 基準點加速計算。
  • 位壓縮存儲:chineseMonths[] 字符數組,每年 2 字節(16 位),高 4 位存閏月月份,低 12 位存 12 月大小(1=大月30天,0=小月29天)。
  • 大閏月特判:bigLeapMonthYears[] 記錄 30 天閏月的年份索引。
  • 節氣查表法:sectionalTermMap/Year、principleTermMap/Year 二維表,結合年份模 4 週期快速定節氣日期。

關鍵 API

ChineseCalendarGB cal = new ChineseCalendarGB();
cal.setGregorian(2024, 5, 18); // 設公曆日期
cal.computeChineseFields();    // 算農曆年月日
cal.computeSolarTerms();       // 算節氣
System.out.println(cal.toString()); // 輸出完整資訊

輸出字段說明

  • chineseYear:農曆年(如 4721)
  • chineseMonth:農曆月(負數表示閏月,如 -4 為閏四月)
  • chineseDate:農曆日
  • sectionalTerm:節氣(如 5=立夏)
  • principleTerm:中氣(如 21=小滿)
  • 干支:(chineseYear-1)%10 天干,%12 地支,生肖同地支

生成 200 年年曆表

調用 getYearTable() 可獲得 58 行文本表格,含公曆/農曆對照、節氣標註、農曆月初標記。格式示例(2000 年 1 月):

一月
日 一 二 三 四 五 六
1/25
2/26 3/27 4/28 5/29 立春 臘月 8/ 2
9/ 3 10/ 4 11/ 5 12/ 6 13/ 7 14/ 8 15/ 9
16/10 17/11 18/12 19/13 20/14 雨水 22/16
23/17 24/18 25/19 26/20 27/21 28/22 29/23
30/24 31/25

說明:1/25 = 公曆 1 日 / 農曆 25 日;立春、雨水 為節氣;臘月 為農曆 12 月初一。

工程應用建議

  1. 直接嵌入:單文件無依賴,複製即用,適合 Android、嵌入式、離線環境。
  2. 擴展節氣名稱:sectionalTermNames[]、principleTermNames[] 可本地化。
  3. 性能優化:頻繁查詢時可緩存 computeChineseFields() 結果,或預生成 200 年查表數組 O(1) 查詢。
  4. 時區處理:基準日為北京時間,跨時區應用需自行換算。

局限性

  • 僅覆蓋 1901-2100 年,超出範圍返回錯誤碼。
  • 未實現「農曆 → 公曆」反向轉換(可通過遍歷 200 年建立反向索引實現)。
  • 未包含時辰(十二時辰)、胎神、彭祖百忌等傳統黃曆信息。

源碼已開源於 CSDN(jeensung,2006),經無數項目驗證,是 Java 端農曆計算的經典參考實現。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved