農曆轉換是中文軟件常見需求。本文提供基于 1900-2049 年農曆數據表的完整轉換方案:SQL Server 存儲過程實現核心算法,C# 調用示例,支持獲取農曆年月日、閏月判斷、中文數字顯示。
每年一條記錄,字段: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);
輸入陽曆日期 @solarDay,輸出格式化農曆字符串(如「一九七八年|五月|二十七」)。核心邏輯:
@offset。f_num_str 將數字轉中文(零一二三四五六七八九)。-- 計算某年總天數
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
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# 實現算法,去除數據庫依賴,提升性能與部署便利性。