欢迎来到奇葩栖息地!欢迎加入Discord服务器:XfrfHCzfbW。请先至特殊:参数设置验证邮箱后再进行编辑。在特殊:参数设置挑选自己想要使用的小工具!不会编辑?请至这里学习Wikitext语法。
模块:Chinese calendar:修订间差异
来自奇葩栖息地
//Edit via InPageEdit
SkyEye FAST(讨论 | 贡献) 无编辑摘要 |
SkyEye FAST(讨论 | 贡献) (//Edit via InPageEdit) |
||
第1行:
local p = {}
-- 农历数据表
local lunarInfo = {
0x04bd8,
0x04ae0,
第31行 ⟶ 第12行:
0x056a0,
0x09ad0,
0x055d2,
0x04ae0,
0x0a5b6,
第41行 ⟶ 第22行:
0x0ada2,
0x095b0,
0x14977,
0x04970,
0x0a4b0,
第51行 ⟶ 第32行:
0x09570,
0x052f2,
0x04970,
0x06566,
0x0d4a0,
第61行 ⟶ 第42行:
0x092e0,
0x1c8d7,
0x0c950,
0x0d4a0,
0x1d8a6,
第71行 ⟶ 第52行:
0x0d2b2,
0x0a950,
0x0b557,
0x06ca0,
0x0b550,
第81行 ⟶ 第62行:
0x0a9a8,
0x0e950,
0x06aa0,
0x0aea6,
0x0ab50,
第91行 ⟶ 第72行:
0x0d950,
0x05b57,
0x056a0,
0x096d0,
0x04dd5,
第101行 ⟶ 第82行:
0x0b540,
0x0b6a0,
0x195a6,
0x095b0,
0x049b0,
第111行 ⟶ 第92行:
0x0af46,
0x0ab60,
0x09570,
0x04af5,
0x04970,
第121行 ⟶ 第102行:
0x0ab60,
0x096d5,
0x092e0,
0x0c960,
0x0d954,
第131行 ⟶ 第112行:
0x025d0,
0x092d0,
0x0cab5,
0x0a950,
0x0b4a0,
第141行 ⟶ 第122行:
0x15176,
0x052b0,
0x0a930,
0x07954,
0x06aa0,
第151行 ⟶ 第132行:
0x0d260,
0x0ea65,
0x0d530,
0x05aa0,
0x076a3,
第161行 ⟶ 第142行:
0x0d250,
0x0d520,
0x0dd45,
0x0b5a0,
0x056d0,
第171行 ⟶ 第152行:
0x1b255,
0x06d20,
0x0ada0,
0x14b63,
0x09370,
第181行 ⟶ 第162行:
0x06b20,
0x1a6c4,
0x0aae0,
0x0a2e0,
0x0d2e3,
第191行 ⟶ 第172行:
0x056a0,
0x0a6d0,
0x055d4,
0x052d0,
0x0a9b8,
第201行 ⟶ 第182行:
0x0aba4,
0x0a5b0,
0x052b0,
0x0b273,
0x06930,
第211行 ⟶ 第192行:
0x0a570,
0x054e4,
0x0d160,
0x0e968,
0x0d520,
第221行 ⟶ 第202行:
0x0a2d0,
0x0d150,
0x0f252,
0x0d520
}
-- 天干
local Gan = { "甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸" }
-- 地支
local Zhi = { "子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥" }
-- 月份
local nStr3 = { "正", "二", "三", "四", "五", "六", "七", "八", "九", "十", "冬", "腊" }
-- 日期
local nStr2 = { "初", "十", "廿", "卅" }
local nStr1 = { "日", "一", "二", "三", "四", "五", "六", "七", "八", "九", "十" }
-- 实现位运算函数
local function band(a, b)
local result = 0
local bitval = 1
while a > 0 and b > 0 do
if a % 2 == 1 and b % 2 == 1 then
result = result + bitval
end
bitval = bitval * 2
a = math.floor(a/2)
b = math.floor(b/2)
end
return
end
local function rshift(a, b)
return math.floor(a / (2^b))
end
-- 计算农历闰月月份
local function leapMonth(y)
return
end
-- 计算农历闰月天数
local function leapDays(y)
if leapMonth(y)
return 30
else
return 29
end
end
return 0
end
-- 计算农历年天数
local function lYearDays(y)
local sum = 348
local
while i > 0x8 do
if
sum = sum + 1
end
i = rshift(i, 1)
end
return sum + leapDays(y)
end
-- 计算农历月份天数
local function monthDays(y, m)
if m > 12 or m < 1 then return -1 end
if band(lunarInfo[y - 1900], rshift(0x10000, m)) ~= 0 then
return 30
end
return 29
end
-- 主要的转换函数
function p.toLunar(frame)
-- 解析输入日期
local date = frame.args[1] or frame:getParent().args.date
if not date then return "日期参数错误" end
local y, m, d = date:match("^(%d%d%d%d)-(%d%d?)-(%d%d?)$")
if not
return
end
y, m, d = tonumber(y), tonumber(m), tonumber(d)
-- 验证日期范围
if y < 1900 or y > 2100 then
return "年份超出范围(1900-2100)"
end
if
return
end
if
return
end
-- 计算
local
local
local offset = math.floor((targetDate - baseDate) / (24 * 60 * 60))
-- 计算农历年
while ly < 2101 and offset > 0 do
temp = lYearDays(ly)
offset = offset - temp
ly = ly + 1
end
if offset < 0 then
offset = offset + temp
ly = ly - 1
end
-- 计算农历月
local
local
local
local leap = leapMonth(ly)
-- 计算月
while offset >
if leap > 0 and lm == leap + 1 and not isLeap then
lm = lm - 1
isLeap = true
temp = leapDays(ly)
else
temp = monthDays(ly, lm)
end
offset = offset - temp
end
-- 计算日
end
end
if offset < 0 then
lm = lm - 1
end
ld = offset + 1
local gzYear = Gan[((ly - 4) % 10) + 1] .. Zhi[((ly - 4) % 12) + 1]
local lMonth = nStr3[lm]
local lDay
if ld == 10 then
lDay = "初十"
elseif ld == 20 then
lDay = "二十"
elseif ld == 30 then
lDay = "三十"
else
lDay = nStr2[math.floor(ld / 10) + 1] .. nStr1[ld % 10 + 1]
end
return
end
|