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

C# 實現陽曆轉農曆(陰曆)算法:含數據表、存儲過程與調用示例

     編輯:關於C#

農曆轉換是中文軟件常見需求。本文提供基于 1900-2049 年農曆數據表的完整轉換方案:SQL Server 存儲過程實現核心算法,C# 調用示例,支持獲取農曆年月日、閏月判斷、中文數字顯示。

核心數據表:SolarData

每年一條記錄,字段:yearId (年份)、data (十六進制編碼字符串)、dataInt (整數編碼)。編碼包含:全年天數、每月大小月、閏月標志、閏月大小。

CREATE TABLE SolarData (yearId int, data char(7), dataInt int);
INSERT INTO SolarData VALUES
(1900, '0x04bd8', 19416), (1901, '0x04ae0', 19168), ...,
(2049, '0x0ada0', 44448);

存儲過程:GetLunar_zhangzs

輸入陽曆日期 @solarDay,輸出格式化農曆字符串(如「一九七八年|五月|二十七」)。核心邏輯:

  1. 計算與基準日 (1900-01-30) 的天數差 @offset。
  2. 遍歷年份扣減全年天數(含閏月天數)定位農曆年份。
  3. 遍歷月份扣減月天數(處理閏月)定位農曆月份。
  4. 剩余天數即農曆日。
  5. 調用自定義函數 f_num_str 將數字轉中文(零一二三四五六七八九)。

關鍵算法片段 (T-SQL)

-- 計算某年總天數
SET @yDays = 348;
SET @j = 32768;
WHILE @j > 8
BEGIN
    IF @iLunar & @j > 0 SET @yDays = @yDays + 1;
    SET @j = @j / 2;
END
-- 閏月判斷
SET @mLeap = @iLunar & 15; -- 低4位表示閏月(1-12, 0無閏)
IF @mLeap > 0
BEGIN
    IF @iLunar & 65536 > 0 SET @mLeapNum = 30 ELSE SET @mLeapNum = 29;
    SET @yDays = @yDays + @mLeapNum;
END

C# 調用示例

private void btnConvert_Click(object sender, EventArgs e)
{
    DateTime dt = monthCalendar1.SelectionStart;
    DataTable dtResult = getLunar_zhangzsTableAdapter.GetData(dt);
    MessageBox.Show("農曆:" + dtResult.Rows[0][1].ToString());
}

優化建議

  • 將數據表緩存到內存 Dictionary<int, int>,純 C# 實現算法,去除數據庫依賴,提升性能與部署便利性。
  • 擴展支持 1900 年前 / 2050 年后需補充編碼數據或改用天文算法(如《推算農曆》標準)。
  • 注意農曆日期顯示習慣:月初一顯示「初一」、十一顯示「十一」、二十顯示「二十」、三十顯示「三十」。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved