当前位置: 首页 > news >正文

网站设计模板照片吕梁seo网站建设

网站设计模板照片,吕梁seo网站建设,手把手做网站页面,海南省教程目录#xff1a;rime中州韵小狼毫须鼠管安装配置教程 保姆级教程 100增强功能配置教程 网络上但凡提到 rime中州韵小狼毫须鼠管输入法#xff0c;总少不了智能时间#xff0c;日期等炫技#xff0c;可见这个便捷时间/日期输入功能是多么的受欢迎。作者也不落窠臼…教程目录rime中州韵小狼毫须鼠管安装配置教程 保姆级教程 100增强功能配置教程 网络上但凡提到 rime中州韵小狼毫须鼠管输入法总少不了智能时间日期等炫技可见这个便捷时间/日期输入功能是多么的受欢迎。作者也不落窠臼今天为大家带来的分享就是 时间日期 滤镜。 先睹为快 在正文开始前我们一起欣赏一下最终的效果吧。 注 本文所分享的dateTime_Filter滤镜与输入方案无关可以在拼音五笔双拼等输入方案中起到同样的功能梯中效果。 时间输入效果 日期输入效果 周序输入效果 事件提醒效果 农历与节气效果 以上是主要的功能效果了其它更多的细节性功能各位看官自行发掘吧。 农历与二十四节气 为了实现农历日期与二十四节气信息的检索我们需要计算二十四节气的时间以及需要计算农历日期与阳历日期的映射关系为此我们需要以下 lunarjieQiModule.lua 和 lunarModule.lua 两个脚本。 lunarjieQiModule.lua lunarjieQiModule.lua 脚本文档实现了二十四节气的计算功能 lunarjieQiModule.lua 文档的脚本内容如下 --该计算脚本取自 博文 https://www.cnblogs.com/moodlxs/archive/2012/09/15/2686472.html --感谢博主 绿色冰点 对脚本的贡献和分享local dbgFlg falselocal function setDbg(flg, printPrefix)dbgFlg flgif nil printPrefix thenprintPrefix endif flg thenprint(printPrefix..flg in lunar is true)end end--节气表 local jqB{春分,清明,谷雨,立夏,小满,芒种,夏至,小暑,大暑,立秋,处暑,白露,秋分,寒露,霜降,立冬,小雪,大雪,冬至,小寒,大寒,立春,雨水,惊蛰} local yueMing{正,二,三,四,五,六,七,八,九,十,冬,腊}--存储以当前日期所在年分为中心前后各1年共3年的节气数据以及对应的节气名 local jq3Y{} local jqN3Y{}--*******农历节气计算部分 --角度变换 --每弧度的角秒数 local rad 180*3600/math.pi --每弧度的角度数 local RAD 180/math.pi --取整数部分 local function int2(v)vmath.floor(v)if v0 thenreturn v1elsereturn vend end--对超过0-2PI的角度转为0-2PI local function rad2mrad(v)vmath.fmod(v ,2*math.pi)if v0 thenreturn v2*math.pielsereturn vend end--将弧度转为字串 local function rad2str(d,tim)---tim0输出格式示例: -23°59 48.23---tim1输出格式示例: 18h 29m 44.52slocal slocal w1° w2’ w3”if d0 thend-ds-endif tim~ 0 thendd*12/math.piw1h w2m w3s elsedd*180/math.piendlocal amath.floor(d) d(d-a)*60local bmath.floor(d) d(d-b)*60local cmath.floor(d) d(d-c)*100dmath.floor(d0.5)if d100 thendd-100cc1endif c60 thencc-60bb1endif b60 thenbb-60aa1enda ab0bc0cd0dlocal alen string.len(a)local blen string.len(b)local clen string.len(c)local dlen string.len(d)s s..string.sub(a, alen-3,alen)w1s s..string.sub(b, blen-2,blen)w2s s..string.sub(c, clen-2,clen).s s..string.sub(d, dlen-2,dlen)w3return s end--日历计算 --2000年前儒略日数(2000-1-1 12:00:00格林威治平时) local J20002451545--日期元件 local JDate{Y2000, M1, D1, h12, m0, s0,--世界时与原子时之差计算表dts {-4000,108371.7,-13036.80,392.000, 0.0000, -500, 17201.0, -627.82, 16.170,-0.3413,-150, 12200.6, -346.41, 5.403,-0.1593, 150, 9113.8, -328.13, -1.647, 0.0377,500, 5707.5, -391.41, 0.915, 0.3145, 900, 2203.4, -283.45, 13.034,-0.1778,1300, 490.1, -57.35, 2.085,-0.0072, 1600, 120.0, -9.81, -1.532, 0.1403,1700, 10.2, -0.91, 0.510,-0.0370, 1800, 13.4, -0.72, 0.202,-0.0193,1830, 7.8, -1.81, 0.416,-0.0247, 1860, 8.3, -0.13, -0.406, 0.0292,1880, -5.4, 0.32, -0.183, 0.0173, 1900, -2.3, 2.06, 0.169,-0.0135,1920, 21.2, 1.69, -0.304, 0.0167, 1940, 24.2, 1.22, -0.064, 0.0031,1960, 33.2, 0.51, 0.231,-0.0109, 1980, 51.0, 1.29, -0.026, 0.0032,2000, 64.7, -1.66, 5.224,-0.2905, 2150, 279.4, 732.95,429.579, 0.0158, 6000},--计算世界时与原子时之差,传入年deltatT function(JDate,y)local ilocal dJDate.dtsfor x1,100, 5 doif yd[x5] or x96 thenixbreakendendlocal t1(y-d[i])/(d[i5]-d[i])*10local t2t1*t1local t3t2*t1return d[i1] d[i2]*t1 d[i3]*t2 d[i4]*t3end,--传入儒略日(J2000起算),计算UTC与原子时的差(单位:日)deltatT2 function(JDate,jd,info)return JDate:deltatT(jd/365.24252000)/86400.0end,--公历转儒略日,UTC1表示原日期是UTCtoJD function(JDate,UTC)--取出年月local yJDate.Y mJDate.M n0if m2 thenmm12yy-1end--判断是否为格里高利历日1582*37210*3115if JDate.Y*372JDate.M*31JDate.D588829 then--加百年闰n int2(y/100) n 2-nint2(n/4)end--加上年引起的偏移日数n n int2(365.2500001*(y4716))--加上月引起的偏移日数及日偏移数n n int2(30.6*(m1))JDate.Dn n ((JDate.s/60JDate.m)/60JDate.h)/24 - 1524.5if(UTC 1) thenreturn nJDate:deltatT2(n-J2000,142)elsereturn nendend,--儒略日数转公历,UTC1表示目标公历是UTCsetFromJD function(JDate,jd,UTC)if UTC1 thenjd jd - JDate:deltatT2(jd-J2000,150)endjdjd0.5--取得日数的整数部份A及小数部分Flocal Aint2(jd)local Fjd-Alocal D0if A2299161 thenDint2((A-1867216.25)/36524.25)AA1D-int2(D/4)end--向前移4年零2个月A A 1524--年JDate.Y int2((A-122.1)/365.25)--去除整年日数后余下日数D A-int2(365.25*JDate.Y)--月数JDate.M int2(D/30.6001)--去除整月日数后余下日数JDate.D D-int2(JDate.M*30.6001)JDate.YJDate.Y-4716 JDate.MJDate.M-1if JDate.M12 thenJDate.MJDate.M - 12endif JDate.M2 thenJDate.Y JDate.Y1end--日的小数转为时分秒FF*24 JDate.hint2(F)FF - JDate.hFF*60 JDate.mint2(F)FF - JDate.mFF*60 JDate.sFend,--设置时间,参数例:20000101 120000或20000101setFromStr function(JDate, s)JDate.Ystring.sub(s, 1,4)JDate.Mstring.sub(s, 5, 6)JDate.Dstring.sub(s,7, 8)JDate.hstring.sub(s, 10, 11)JDate.mstring.sub(s, 12,13)JDate.sstring.sub(s, 14,18)end,--日期转为串toStr function(JDate)local Y0..JDate.Ylocal M0..JDate.Mlocal D0..JDate.Dlocal hJDate.hlocal mJDate.mlocal smath.floor(JDate.s.5)if s60 thenss-60mm1endif m60 thenmm-60hh1endh0.. hm0..ms0..slocal Ylen string.len(Y)local Mlen string.len(M)local Dlen string.len(D)local hlen string.len(h)local mlen string.len(m)local slen string.len(s)Ystring.sub(Y, Ylen-3,Ylen)Mstring.sub(M, Mlen-1,Mlen)Dstring.sub(D,Dlen-1, Dlen)hstring.sub(h, hlen-1, hlen)mstring.sub(m, mlen-1,mlen)sstring.sub(s, slen-1,slen)return Y..-..M..-..D.. ..h..:..m..:..send,--输出节气日期的秒数JQ function(JDate)local t {}t.yearJDate.Yt.monthJDate.Mt.dayJDate.Dt.hourJDate.ht.minJDate.mt.secmath.floor(JDate.s.5)if t.sec60 thent.sect.sec-60t.mint.min1endif t.min60 thent.mint.min-60t.hourt.hour1endreturn os.time(t)end,--算出:jd 转到当地UTC后,UTC日数的整数部分或小数部分Dint_dec function(JDate,jd,shiqu,int_dec)--基于J2000力学时jd的起算点是12:00:00时,所以跳日时刻发生在12:00:00,这与日历计算发生矛盾--把jd改正为00:00:00起算,这样儒略日的跳日动作就与日期的跳日同步--改正方法为jdjd0.5-deltatTshiqu/24--把儒略日的起点移动-0.5(即前移12小时)--式中shiqu是时区,北京的起算点是-8小时,shiqu取8local ujd0.5-JDate:deltatT2(jd,252)shiqu/24if int_dec~ 0 then--返回整数部分return math.floor(u)else--返回小数部分return u-math.floor(u)endend,--计算两个日期的相差的天数,输入字串格式日期,如:20080101d1_d2 function(JDate,d1,d2)--备份原来的数据local YJDate.Y local MJDate.Mlocal DJDate.Dlocal hJDate.hlocal mJDate.mlocal sJDate.sJDate.setFromStr(string.sub(d1,1,8) 120000)local jd1JDate.toJD(0)JDate.setFromStr(string.sub(d2,1,8) 120000)local jd2JDate.toJD(0)--还原JDate.YYJDate.MMJDate.DDJDate.hhJDate.mmJDate.ssif jd1jd2 thenreturn math.floor(jd1-jd2.0001)elsereturn -Math.floor(jd2-jd1.0001)endend, }--黄赤交角及黄赤坐标变换 --黄赤交角系数表 local hcjjB {84381.448, -46.8150, -0.00059, 0.001813} --Date黄道上的岁差p local preceB {0,50287.92262,111.24406,0.07699,-0.23479,-0.00178,0.00018,0.00001}--返回黄赤交角(常规精度),短期精度很高 local function hcjj1 (t)local t1t/36525 local t2t1*t1local t3t2*t1return (hcjjB[1] hcjjB[2]*t1 hcjjB[3]*t2 hcjjB[4]*t3)/rad end--黄赤转换(黄赤坐标旋转) local function HCconv(JW,E)--黄道赤道坐标变换,赤到黄E取负local HJrad2mrad(JW[1])local HWJW[2]local sinE math.sin(E)local cosE math.cos(E)local sinWcosE*math.sin(HW)sinE*math.cos(HW)*math.sin(HJ)local Jmath.atan2( math.sin(HJ)*cosE-math.tan(HW)*sinE, math.cos(HJ))JW[1]rad2mrad(J)JW[2]math.asin(sinW) end--补岁差 local function addPrece(jd,zb)local ilocal t1local v0local t1jd/365250for i2,8 dott*t1vvpreceB[i]*tendzb[1]rad2mrad(zb[1](v2.9965*t1)/rad) end--光行差 --离心率 local GXC_e{0.016708634, -0.000042037,-0.0000001267} --近点 local GXC_p{102.93735/RAD,1.71946/RAD, 0.00046/RAD} --太平黄经 local GXC_l{280.4664567/RAD,36000.76982779/RAD,0.0003032028/RAD,1/49931000/RAD,-1/153000000/RAD} --光行差常数 local GXC_k20.49552/rad --恒星周年光行差计算(黄道坐标中) local function addGxc(t,zb)local t1t/36525local t2t1*t1local t3t2*t1local t4t3*t1local LGXC_l[1] GXC_l[2]*t1 GXC_l[3]*t2 GXC_l[4]*t3 GXC_l[5]*t4local pGXC_p[1] GXC_p[2]*t1 GXC_p[3]*t2local eGXC_e[1] GXC_e[2]*t1 GXC_e[3]*t2local dLL-zb[1]local dPp-zb[1]zb[1]zb[1] - (GXC_k * (math.cos(dL)-e*math.cos(dP)) / math.cos(zb[2]))zb[2]zb[2] - (GXC_k * math.sin(zb[2]) * (math.sin(dL)-e*math.sin(dP)))--print(aa, L,p,e,dL,dP,zb[1], zb[2])zb[1]rad2mrad(zb[1]) end--章动计算 --章动表 local nutB{2.1824391966, -33.757045954, 0.0000362262, 3.7340E-08,-2.8793E-10,-171996,-1742,92025, 89,3.5069406862, 1256.663930738, 0.0000105845, 6.9813E-10,-2.2815E-10, -13187, -16, 5736,-31,1.3375032491, 16799.418221925,-0.0000511866, 6.4626E-08,-5.3543E-10, -2274, -2, 977, -5,4.3648783932, -67.514091907, 0.0000724525, 7.4681E-08,-5.7586E-10, 2062, 2, -895, 5,0.0431251803, -628.301955171, 0.0000026820, 6.5935E-10, 5.5705E-11, -1426, 34, 54, -1,2.3555557435, 8328.691425719, 0.0001545547, 2.5033E-07,-1.1863E-09, 712, 1, -7, 0,3.4638155059, 1884.965885909, 0.0000079025, 3.8785E-11,-2.8386E-10, -517, 12, 224, -6,5.4382493597, 16833.175267879,-0.0000874129, 2.7285E-08,-2.4750E-10, -386, -4, 200, 0,3.6930589926, 25128.109647645, 0.0001033681, 3.1496E-07,-1.7218E-09, -301, 0, 129, -1,3.5500658664, 628.361975567, 0.0000132664, 1.3575E-09,-1.7245E-10, 217, -5, -95, 3}--计算黄经章动及交角章动 local function nutation(t)local d{}d.Lon0d.Obl0tt/36525local i,clocal t1tlocal t2t1*t1local t3t2*t1local t4t3*t1local t5t4*t1for i1,#nutB,9 docnutB[i] nutB[i1]*t1 nutB[i2]*t2 nutB[i3]*t3 nutB[i4]*t4--黄经章动d.Lond.Lon (nutB[i5]nutB[i6]*t/10)*math.sin(c)--交角章动d.Obld.Obl (nutB[i7]nutB[i8]*t/10)*math.cos(c)end--黄经章动d.Lond.Lon/(rad*10000)--交角章动d.Obld.Obl/(rad*10000)return d end--本函数计算赤经章动及赤纬章动 local function nutationRaDec(t,zb)local Razb[1]local Deczb[2]local Ehcjj1(t)local sinEmath.sin(E)--计算黄赤交角local cosEmath.cos(E)--计算黄经章动及交角章动local dnutation(t)local cosRamath.cos(Ra)local sinRamath.sin(Ra)local tanDecmath.tan(Dec)--赤经章动zb[1]zb[1] (cosEsinE*sinRa*tanDec)*d.Lon-cosRa*tanDec*d.Obl--赤纬章动zb[2] zb[2] sinE*cosRa*d.LonsinRa*d.Oblzb[1]rad2mrad(zb[1]) end--以下是月球及地球运动参数表 --[[*************************************** * 如果用记事本查看此代码,请在格式菜单中去除自动换行 * E10是关于地球的,格式如下: * 它是一个数组,每3个数看作一条记录,每条记录的3个数记为A,B,C * recA*cos(BC*t) 式中t是J2000起算的儒略千年数 * 每条记录的计算结果(即rec)取和即得地球的日心黄经的周期量L0 * E11格式如下: rec A*cos*(BC*t) *t, 取和后得泊松量L1 * E12格式如下: rec A*cos*(BC*t) *t*t, 取和后得泊松量L2 * E13格式如下: rec A*cos*(BC*t) *t*t*t, 取和后得泊松量L3 * 最后地球的地心黄经:L L0L1L2L3... * E20,E21,E22,E23...用于计算黄纬 * M10,M11等是关于月球的,参数的用法请阅读Mnn()函数 ***************************************** --]] --地球运动VSOP87参数 --黄经周期项 local E10{1.75347045673, 0.00000000000, 0.0000000000, 0.03341656456, 4.66925680417, 6283.0758499914, 0.00034894275, 4.62610241759, 12566.1516999828, 0.00003417571, 2.82886579606, 3.5231183490,0.00003497056, 2.74411800971, 5753.3848848968, 0.00003135896, 3.62767041758, 77713.7714681205, 0.00002676218, 4.41808351397, 7860.4193924392, 0.00002342687, 6.13516237631, 3930.2096962196,0.00001273166, 2.03709655772, 529.6909650946, 0.00001324292, 0.74246356352, 11506.7697697936, 0.00000901855, 2.04505443513, 26.2983197998, 0.00001199167, 1.10962944315, 1577.3435424478,0.00000857223, 3.50849156957, 398.1490034082, 0.00000779786, 1.17882652114, 5223.6939198022, 0.00000990250, 5.23268129594, 5884.9268465832, 0.00000753141, 2.53339053818, 5507.5532386674,0.00000505264, 4.58292563052, 18849.2275499742, 0.00000492379, 4.20506639861, 775.5226113240, 0.00000356655, 2.91954116867, 0.0673103028, 0.00000284125, 1.89869034186, 796.2980068164,0.00000242810, 0.34481140906, 5486.7778431750, 0.00000317087, 5.84901952218, 11790.6290886588, 0.00000271039, 0.31488607649, 10977.0788046990, 0.00000206160, 4.80646606059, 2544.3144198834,0.00000205385, 1.86947813692, 5573.1428014331, 0.00000202261, 2.45767795458, 6069.7767545534, 0.00000126184, 1.08302630210, 20.7753954924, 0.00000155516, 0.83306073807, 213.2990954380,0.00000115132, 0.64544911683, 0.9803210682, 0.00000102851, 0.63599846727, 4694.0029547076, 0.00000101724, 4.26679821365, 7.1135470008, 0.00000099206, 6.20992940258, 2146.1654164752,0.00000132212, 3.41118275555, 2942.4634232916, 0.00000097607, 0.68101272270, 155.4203994342, 0.00000085128, 1.29870743025, 6275.9623029906, 0.00000074651, 1.75508916159, 5088.6288397668,0.00000101895, 0.97569221824, 15720.8387848784, 0.00000084711, 3.67080093025, 71430.6956181291, 0.00000073547, 4.67926565481, 801.8209311238, 0.00000073874, 3.50319443167, 3154.6870848956,0.00000078756, 3.03698313141, 12036.4607348882, 0.00000079637, 1.80791330700, 17260.1546546904, 0.00000085803, 5.98322631256,161000.6857376741, 0.00000056963, 2.78430398043, 6286.5989683404,0.00000061148, 1.81839811024, 7084.8967811152, 0.00000069627, 0.83297596966, 9437.7629348870, 0.00000056116, 4.38694880779, 14143.4952424306, 0.00000062449, 3.97763880587, 8827.3902698748,0.00000051145, 0.28306864501, 5856.4776591154, 0.00000055577, 3.47006009062, 6279.5527316424, 0.00000041036, 5.36817351402, 8429.2412664666, 0.00000051605, 1.33282746983, 1748.0164130670,0.00000051992, 0.18914945834, 12139.5535091068, 0.00000049000, 0.48735065033, 1194.4470102246, 0.00000039200, 6.16832995016, 10447.3878396044, 0.00000035566, 1.77597314691, 6812.7668150860,0.00000036770, 6.04133859347, 10213.2855462110, 0.00000036596, 2.56955238628, 1059.3819301892, 0.00000033291, 0.59309499459, 17789.8456197850, 0.00000035954, 1.70876111898, 2352.8661537718} --黄经泊松1项 local E11{6283.31966747491,0.00000000000, 0.0000000000, 0.00206058863, 2.67823455584, 6283.0758499914, 0.00004303430, 2.63512650414, 12566.1516999828, 0.00000425264, 1.59046980729, 3.5231183490,0.00000108977, 2.96618001993, 1577.3435424478, 0.00000093478, 2.59212835365, 18849.2275499742, 0.00000119261, 5.79557487799, 26.2983197998, 0.00000072122, 1.13846158196, 529.6909650946,0.00000067768, 1.87472304791, 398.1490034082, 0.00000067327, 4.40918235168, 5507.5532386674, 0.00000059027, 2.88797038460, 5223.6939198022, 0.00000055976, 2.17471680261, 155.4203994342,0.00000045407, 0.39803079805, 796.2980068164, 0.00000036369, 0.46624739835, 775.5226113240, 0.00000028958, 2.64707383882, 7.1135470008, 0.00000019097, 1.84628332577, 5486.7778431750, 0.00000020844, 5.34138275149, 0.9803210682, 0.00000018508, 4.96855124577, 213.2990954380, 0.00000016233, 0.03216483047, 2544.3144198834, 0.00000017293, 2.99116864949, 6275.9623029906} --黄经泊松2项 local E12{0.00052918870, 0.00000000000, 0.0000000000, 0.00008719837, 1.07209665242, 6283.0758499914, 0.00000309125, 0.86728818832, 12566.1516999828, 0.00000027339, 0.05297871691, 3.5231183490,0.00000016334, 5.18826691036, 26.2983197998, 0.00000015752, 3.68457889430, 155.4203994342, 0.00000009541, 0.75742297675, 18849.2275499742, 0.00000008937, 2.05705419118, 77713.7714681205,0.00000006952, 0.82673305410, 775.5226113240, 0.00000005064, 4.66284525271, 1577.3435424478} local E13{0.00000289226, 5.84384198723, 6283.0758499914, 0.00000034955, 0.00000000000, 0.0000000000, 0.00000016819, 5.48766912348, 12566.1516999828} local E14{0.00000114084, 3.14159265359, 0.0000000000, 0.00000007717, 4.13446589358, 6283.0758499914, 0.00000000765, 3.83803776214, 12566.1516999828} local E15{0.00000000878, 3.14159265359, 0.0000000000 } --黄纬周期项 local E20{0.00000279620, 3.19870156017, 84334.6615813083, 0.00000101643, 5.42248619256, 5507.5532386674, 0.00000080445, 3.88013204458, 5223.6939198022, 0.00000043806, 3.70444689758, 2352.8661537718,0.00000031933, 4.00026369781, 1577.3435424478, 0.00000022724, 3.98473831560, 1047.7473117547, 0.00000016392, 3.56456119782, 5856.4776591154, 0.00000018141, 4.98367470263, 6283.0758499914,0.00000014443, 3.70275614914, 9437.7629348870, 0.00000014304, 3.41117857525, 10213.2855462110} local E21{0.00000009030, 3.89729061890, 5507.5532386674, 0.00000006177, 1.73038850355, 5223.6939198022} --距离周期项 local E30{1.00013988799, 0.00000000000, 0.0000000000, 0.01670699626, 3.09846350771, 6283.0758499914, 0.00013956023, 3.05524609620, 12566.1516999828, 0.00003083720, 5.19846674381, 77713.7714681205,0.00001628461, 1.17387749012, 5753.3848848968, 0.00001575568, 2.84685245825, 7860.4193924392, 0.00000924799, 5.45292234084, 11506.7697697936, 0.00000542444, 4.56409149777, 3930.2096962196} local E31{0.00103018608, 1.10748969588, 6283.0758499914, 0.00001721238, 1.06442301418, 12566.1516999828, 0.00000702215, 3.14159265359, 0.0000000000} local E32{0.00004359385, 5.78455133738, 6283.0758499914 } local E33{0.00000144595, 4.27319435148, 6283.0758499914 } --月球运动参数 local M10{22639.5858800, 2.3555545723, 8328.6914247251, 1.5231275E-04, 2.5041111E-07,-1.1863391E-09, 4586.4383203, 8.0413790709, 7214.0628654588,-2.1850087E-04,-1.8646419E-07, 8.7760973E-10, 2369.9139357, 10.3969336431, 15542.7542901840,-6.6188121E-05, 6.3946925E-08,-3.0872935E-10, 769.0257187, 4.7111091445, 16657.3828494503, 3.0462550E-04, 5.0082223E-07,-2.3726782E-09,-666.4175399, -0.0431256817, 628.3019552485,-2.6638815E-06, 6.1639211E-10,-5.4439728E-11, -411.5957339, 3.2558104895, 16866.9323152810,-1.2804259E-04,-9.8998954E-09, 4.0433461E-11, 211.6555524, 5.6858244986, -1114.6285592663,-3.7081362E-04,-4.3687530E-07, 2.0639488E-09, 205.4359530, 8.0845047526, 6585.7609102104,-2.1583699E-04,-1.8708058E-07, 9.3204945E-10,191.9561973, 12.7524882154, 23871.4457149091, 8.6124629E-05, 3.1435804E-07,-1.4950684E-09, 164.7286185, 10.4400593249, 14914.4523349355,-6.3524240E-05, 6.3330532E-08,-2.5428962E-10, -147.3213842, -2.3986802540, -7700.3894694766,-1.5497663E-04,-2.4979472E-07, 1.1318993E-09, -124.9881185, 5.1984668216, 7771.3771450920,-3.3094061E-05, 3.1973462E-08,-1.5436468E-10,-109.3803637, 2.3124288905, 8956.9933799736, 1.4964887E-04, 2.5102751E-07,-1.2407788E-09, 55.1770578, 7.1411231536, -1324.1780250970, 6.1854469E-05, 7.3846820E-08,-3.4916281E-10, -45.0996092, 5.6113650618, 25195.6237400061, 2.4270161E-05, 2.4051122E-07,-1.1459056E-09, 39.5333010, -0.9002559173, -8538.2408905558, 2.8035534E-04, 2.6031101E-07,-1.2267725E-09,38.4298346, 18.4383127140, 22756.8171556428,-2.8468899E-04,-1.2251727E-07, 5.6888037E-10, 36.1238141, 7.0666637168, 24986.0742741754, 4.5693825E-04, 7.5123334E-07,-3.5590172E-09, 30.7725751, 16.0827581417, 14428.1257309177,-4.3700174E-04,-3.7292838E-07, 1.7552195E-09, -28.3971008, 7.9982533891, 7842.3648207073,-2.2116475E-04,-1.8584780E-07, 8.2317000E-10,-24.3582283, 10.3538079614, 16171.0562454324,-6.8852003E-05, 6.4563317E-08,-3.6316908E-10, -18.5847068, 2.8429122493, -557.3142796331,-1.8540681E-04,-2.1843765E-07, 1.0319744E-09, 17.9544674, 5.1553411398, 8399.6791003405,-3.5757942E-05, 3.2589854E-08,-2.0880440E-10, 14.5302779, 12.7956138971, 23243.1437596606, 8.8788511E-05, 3.1374165E-07,-1.4406287E-09,14.3796974, 15.1080427876, 32200.1371396342, 2.3843738E-04, 5.6476915E-07,-2.6814075E-09, 14.2514576,-24.0810366320, -2.3011998397, 1.5231275E-04, 2.5041111E-07,-1.1863391E-09, 13.8990596, 20.7938672862, 31085.5085803679,-1.3237624E-04, 1.2789385E-07,-6.1745870E-10, 13.1940636, 3.3302699264, -9443.3199839914,-5.2312637E-04,-6.8728642E-07, 3.2502879E-09,-9.6790568, -4.7542348263,-16029.0808942018,-3.0728938E-04,-5.0020584E-07, 2.3182384E-09, -9.3658635, 11.2971895604, 24080.9951807398,-3.4654346E-04,-1.9636409E-07, 9.1804319E-10, 8.6055318, 5.7289501804, -1742.9305145148,-3.6814974E-04,-4.3749170E-07, 2.1183885E-09, -8.4530982, 7.5540213938, 16100.0685698171, 1.1921869E-04, 2.8238458E-07,-1.3407038E-09,8.0501724, 10.4831850066, 14286.1503796870,-6.0860358E-05, 6.2714140E-08,-1.9984990E-10, -7.6301553, 4.6679834628, 17285.6848046987, 3.0196162E-04, 5.0143862E-07,-2.4271179E-09, -7.4474952, -0.0862513635, 1256.6039104970,-5.3277630E-06, 1.2327842E-09,-1.0887946E-10, 7.3712011, 8.1276304344, 5957.4589549619,-2.1317311E-04,-1.8769697E-07, 9.8648918E-10,7.0629900, 0.9591375719, 33.7570471374,-3.0829302E-05,-3.6967043E-08, 1.7385419E-10, -6.3831491, 9.4966777258, 7004.5133996281, 2.1416722E-04, 3.2425793E-07,-1.5355019E-09, -5.7416071, 13.6527441326, 32409.6866054649,-1.9423071E-04, 5.4047029E-08,-2.6829589E-10, 4.3740095, 18.4814383957, 22128.5152003943,-2.8202511E-04,-1.2313366E-07, 6.2332010E-10,-3.9976134, 7.9669196340, 33524.3151647312, 1.7658291E-04, 4.9092233E-07,-2.3322447E-09, -3.2096876, 13.2398458924, 14985.4400105508,-2.5159493E-04,-1.5449073E-07, 7.2324505E-10, -2.9145404, 12.7093625336, 24499.7476701576, 8.3460748E-05, 3.1497443E-07,-1.5495082E-09, 2.7318890, 16.1258838235, 13799.8237756692,-4.3433786E-04,-3.7354477E-07, 1.8096592E-09,-2.5679459, -2.4418059357, -7072.0875142282,-1.5764051E-04,-2.4917833E-07, 1.0774596E-09, -2.5211990, 7.9551277074, 8470.6667759558,-2.2382863E-04,-1.8523141E-07, 7.6873027E-10, 2.4888871, 5.6426988169, -486.3266040178,-3.7347750E-04,-4.3625891E-07, 2.0095091E-09, 2.1460741, 7.1842488353, -1952.4799803455, 6.4518350E-05, 7.3230428E-08,-2.9472308E-10,1.9777270, 23.1494218585, 39414.2000050930, 1.9936508E-05, 3.7830496E-07,-1.8037978E-09, 1.9336825, 9.4222182890, 33314.7656989005, 6.0925100E-04, 1.0016445E-06,-4.7453563E-09, 1.8707647, 20.8369929680, 30457.2066251194,-1.2971236E-04, 1.2727746E-07,-5.6301898E-10, -1.7529659, 0.4873576771, -8886.0057043583,-3.3771956E-04,-4.6884877E-07, 2.2183135E-09,-1.4371624, 7.0979974718, -695.8760698485, 5.9190587E-05, 7.4463212E-08,-4.0360254E-10, -1.3725701, 1.4552986550, -209.5494658307, 4.3266809E-04, 5.1072212E-07,-2.4131116E-09, 1.2618162, 7.5108957121, 16728.3705250656, 1.1655481E-04, 2.8300097E-07,-1.3951435E-09} local M11{1.6768000, -0.0431256817, 628.3019552485,-2.6638815E-06, 6.1639211E-10,-5.4439728E-11, 0.5164200, 11.2260974062, 6585.7609102104,-2.1583699E-04,-1.8708058E-07, 9.3204945E-10, 0.4138300, 13.5816519784, 14914.4523349355,-6.3524240E-05, 6.3330532E-08,-2.5428962E-10, 0.3711500, 5.5402729076, 7700.3894694766, 1.5497663E-04, 2.4979472E-07,-1.1318993E-09,0.2756000, 2.3124288905, 8956.9933799736, 1.4964887E-04, 2.5102751E-07,-1.2407788E-09, 0.2459863,-25.6198212459, -2.3011998397, 1.5231275E-04, 2.5041111E-07,-1.1863391E-09, 0.0711800, 7.9982533891, 7842.3648207073,-2.2116475E-04,-1.8584780E-07, 8.2317000E-10, 0.0612800, 10.3538079614, 16171.0562454324,-6.8852003E-05, 6.4563317E-08,-3.6316908E-10} local M12{0.0048700, -0.0431256817, 628.3019552485,-2.6638815E-06, 6.1639211E-10,-5.4439728E-11, 0.0022800,-27.1705318325, -2.3011998397, 1.5231275E-04, 2.5041111E-07,-1.1863391E-09, 0.0015000, 11.2260974062, 6585.7609102104,-2.1583699E-04,-1.8708058E-07, 9.3204945E-10} local M20{18461.2400600, 1.6279052448, 8433.4661576405,-6.4021295E-05,-4.9499477E-09, 2.0216731E-11, 1010.1671484, 3.9834598170, 16762.1575823656, 8.8291456E-05, 2.4546117E-07,-1.1661223E-09, 999.6936555, 0.7276493275, -104.7747329154, 2.1633405E-04, 2.5536106E-07,-1.2065558E-09, 623.6524746, 8.7690283983, 7109.2881325435,-2.1668263E-06, 6.8896872E-08,-3.2894608E-10,199.4837596, 9.6692843156, 15647.5290230993,-2.8252217E-04,-1.9141414E-07, 8.9782646E-10, 166.5741153, 6.4134738261, -1219.4032921817,-1.5447958E-04,-1.8151424E-07, 8.5739300E-10, 117.2606951, 12.0248388879, 23976.2204478244,-1.3020942E-04, 5.8996977E-08,-2.8851262E-10, 61.9119504, 6.3390143893, 25090.8490070907, 2.4060421E-04, 4.9587228E-07,-2.3524614E-09,33.3572027, 11.1245829706, 15437.9795572686, 1.5014592E-04, 3.1930799E-07,-1.5152852E-09, 31.7596709, 3.0832038997, 8223.9166918098, 3.6864680E-04, 5.0577218E-07,-2.3928949E-09, 29.5766003, 8.8121540801, 6480.9861772950, 4.9705523E-07, 6.8280480E-08,-2.7450635E-10, 15.5662654, 4.0579192538, -9548.0947169068,-3.0679233E-04,-4.3192536E-07, 2.0437321E-09,15.1215543, 14.3803934601, 32304.9118725496, 2.2103334E-05, 3.0940809E-07,-1.4748517E-09, -12.0941511, 8.7259027166, 7737.5900877920,-4.8307078E-06, 6.9513264E-08,-3.8338581E-10, 8.8681426, 9.7124099974, 15019.2270678508,-2.7985829E-04,-1.9203053E-07, 9.5226618E-10, 8.0450400, 0.6687636586, 8399.7091105030,-3.3191993E-05, 3.2017096E-08,-1.5363746E-10,7.9585542, 12.0679645696, 23347.9184925760,-1.2754553E-04, 5.8380585E-08,-2.3407289E-10, 7.4345550, 6.4565995078, -1847.7052474301,-1.5181570E-04,-1.8213063E-07, 9.1183272E-10, -6.7314363, -4.0265854988,-16133.8556271171,-9.0955337E-05,-2.4484477E-07, 1.1116826E-09, 6.5795750, 16.8104074692, 14323.3509980023,-2.2066770E-04,-1.1756732E-07, 5.4866364E-10,-6.4600721, 1.5847795630, 9061.7681128890,-6.6685176E-05,-4.3335556E-09,-3.4222998E-11, -6.2964773, 4.8837157343, 25300.3984729215,-1.9206388E-04,-1.4849843E-08, 6.0650192E-11, -5.6323538, -0.7707750092, 733.0766881638,-2.1899793E-04,-2.5474467E-07, 1.1521161E-09, -5.3683961, 6.8263720663, 16204.8433027325,-9.7115356E-05, 2.7023515E-08,-1.3414795E-10,-5.3112784, 3.9403341353, 17390.4595376141, 8.5627574E-05, 2.4607756E-07,-1.2205621E-09, -5.0759179, 0.6845236457, 523.5272223331, 2.1367016E-04, 2.5597745E-07,-1.2609955E-09, -4.8396143, -1.6710309265, -7805.1642023920, 6.1357413E-05, 5.5663398E-09,-7.4656459E-11, -4.8057401, 3.5705615768, -662.0890125485, 3.0927234E-05, 3.6923410E-08,-1.7458141E-10,3.9840545, 8.6945689615, 33419.5404318159, 3.9291696E-04, 7.4628340E-07,-3.5388005E-09, 3.6744619, 19.1659620415, 22652.0424227274,-6.8354947E-05, 1.3284380E-07,-6.3767543E-10, 2.9984815, 20.0662179587, 31190.2833132833,-3.4871029E-04,-1.2746721E-07, 5.8909710E-10, 2.7986413, -2.5281611620,-16971.7070481963, 3.4437664E-04, 2.6526096E-07,-1.2469893E-09,2.4138774, 17.7106633865, 22861.5918885581,-5.0102304E-04,-3.7787833E-07, 1.7754362E-09, 2.1863132, 5.5132179088, -9757.6441827375, 1.2587576E-04, 7.8796768E-08,-3.6937954E-10, 2.1461692, 13.4801375428, 23766.6709819937, 3.0245868E-04, 5.6971910E-07,-2.7016242E-09, 1.7659832, 11.1677086523, 14809.6776020201, 1.5280981E-04, 3.1869159E-07,-1.4608454E-09,-1.6244212, 7.3137297434, 7318.8375983742,-4.3483492E-04,-4.4182525E-07, 2.0841655E-09, 1.5813036, 5.4387584720, 16552.6081165349, 5.2095955E-04, 7.5618329E-07,-3.5792340E-09, 1.5197528, 16.7359480324, 40633.6032972747, 1.7441609E-04, 5.5981921E-07,-2.6611908E-09, 1.5156341, 1.7023646816,-17876.7861416319,-4.5910508E-04,-6.8233647E-07, 3.2300712E-09,1.5102092, 5.4977296450, 8399.6847301375,-3.3094061E-05, 3.1973462E-08,-1.5436468E-10, -1.3178223, 9.6261586339, 16275.8309783478,-2.8518605E-04,-1.9079775E-07, 8.4338673E-10, -1.2642739, 11.9817132061, 24604.5224030729,-1.3287330E-04, 5.9613369E-08,-3.4295235E-10, 1.1918723, 22.4217725310, 39518.9747380084,-1.9639754E-04, 1.2294390E-07,-5.9724197E-10,1.1346110, 14.4235191419, 31676.6099173011, 2.4767216E-05, 3.0879170E-07,-1.4204120E-09, 1.0857810, 8.8552797618, 5852.6842220465, 3.1609367E-06, 6.7664088E-08,-2.2006663E-10, -1.0193852, 7.2392703065, 33629.0898976466,-3.9751134E-05, 2.3556127E-07,-1.1256889E-09, -0.8227141, 11.0814572888, 16066.2815125171, 1.4748204E-04, 3.1992438E-07,-1.5697249E-09,0.8042238, 3.5274358950, -33.7870573000, 2.8263353E-05, 3.7539802E-08,-2.2902113E-10, 0.8025939, 6.7832463846, 16833.1452579809,-9.9779237E-05, 2.7639907E-08,-1.8858767E-10, -0.7931866, -6.3821400710,-24462.5470518423,-2.4326809E-04,-4.9525589E-07, 2.2980217E-09, -0.7910153, 6.3703481443, -591.1013369332,-1.5714346E-04,-1.8089785E-07, 8.0295327E-10,-0.6674056, 9.1819266386, 24533.5347274576, 5.5197395E-05, 2.7743463E-07,-1.3204870E-09, 0.6502226, 4.1010449356,-10176.3966721553,-3.0412845E-04,-4.3254175E-07, 2.0981718E-09, -0.6388131, 6.2958887075, 25719.1509623392, 2.3794032E-04, 4.9648867E-07,-2.4069012E-09} local M21{0.0743000, 11.9537467337, 6480.9861772950, 4.9705523E-07, 6.8280480E-08,-2.7450635E-10, 0.0304300, 8.7259027166, 7737.5900877920,-4.8307078E-06, 6.9513264E-08,-3.8338581E-10, 0.0222900, 12.8540026510, 15019.2270678508,-2.7985829E-04,-1.9203053E-07, 9.5226618E-10, 0.0199900, 15.2095572232, 23347.9184925760,-1.2754553E-04, 5.8380585E-08,-2.3407289E-10,0.0186900, 9.5981921614, -1847.7052474301,-1.5181570E-04,-1.8213063E-07, 9.1183272E-10, 0.0169600, 7.1681781524, 16133.8556271171, 9.0955337E-05, 2.4484477E-07,-1.1116826E-09, 0.0162300, 1.5847795630, 9061.7681128890,-6.6685176E-05,-4.3335556E-09,-3.4222998E-11, 0.0141900, -0.7707750092, 733.0766881638,-2.1899793E-04,-2.5474467E-07, 1.1521161E-09} local M30{385000.5290396, 1.5707963268, 0.0000000000, 0.0000000E00, 0.0000000E00, 0.0000000E00,-20905.3551378, 3.9263508990, 8328.6914247251, 1.5231275E-04, 2.5041111E-07,-1.1863391E-09,-3699.1109330, 9.6121753977, 7214.0628654588,-2.1850087E-04,-1.8646419E-07, 8.7760973E-10,-2955.9675626, 11.9677299699, 15542.7542901840,-6.6188121E-05, 6.3946925E-08,-3.0872935E-10,-569.9251264, 6.2819054713, 16657.3828494503, 3.0462550E-04, 5.0082223E-07,-2.3726782E-09, 246.1584797, 7.2566208254, -1114.6285592663,-3.7081362E-04,-4.3687530E-07, 2.0639488E-09, -204.5861179, 12.0108556517, 14914.4523349355,-6.3524240E-05, 6.3330532E-08,-2.5428962E-10, -170.7330791, 14.3232845422, 23871.4457149091, 8.6124629E-05, 3.1435804E-07,-1.4950684E-09,-152.1378118, 9.6553010794, 6585.7609102104,-2.1583699E-04,-1.8708058E-07, 9.3204945E-10, -129.6202242, -0.8278839272, -7700.3894694766,-1.5497663E-04,-2.4979472E-07, 1.1318993E-09, 108.7427014, 6.7692631483, 7771.3771450920,-3.3094061E-05, 3.1973462E-08,-1.5436468E-10, 104.7552944, 3.8832252173, 8956.9933799736, 1.4964887E-04, 2.5102751E-07,-1.2407788E-09,79.6605685, 0.6705404095, -8538.2408905558, 2.8035534E-04, 2.6031101E-07,-1.2267725E-09, 48.8883284, 1.5276706450, 628.3019552485,-2.6638815E-06, 6.1639211E-10,-5.4439728E-11, -34.7825237, 20.0091090408, 22756.8171556428,-2.8468899E-04,-1.2251727E-07, 5.6888037E-10, 30.8238599, 11.9246042882, 16171.0562454324,-6.8852003E-05, 6.4563317E-08,-3.6316908E-10,24.2084985, 9.5690497159, 7842.3648207073,-2.2116475E-04,-1.8584780E-07, 8.2317000E-10, -23.2104305, 8.6374600436, 24986.0742741754, 4.5693825E-04, 7.5123334E-07,-3.5590172E-09, -21.6363439, 17.6535544685, 14428.1257309177,-4.3700174E-04,-3.7292838E-07, 1.7552195E-09, -16.6747239, 6.7261374666, 8399.6791003405,-3.5757942E-05, 3.2589854E-08,-2.0880440E-10,14.4026890, 4.9010662531, -9443.3199839914,-5.2312637E-04,-6.8728642E-07, 3.2502879E-09, -12.8314035, 14.3664102239, 23243.1437596606, 8.8788511E-05, 3.1374165E-07,-1.4406287E-09, -11.6499478, 22.3646636130, 31085.5085803679,-1.3237624E-04, 1.2789385E-07,-6.1745870E-10, -10.4447578, 16.6788391144, 32200.1371396342, 2.3843738E-04, 5.6476915E-07,-2.6814075E-09,10.3211071, 8.7119194804, -1324.1780250970, 6.1854469E-05, 7.3846820E-08,-3.4916281E-10, 10.0562033, 7.2997465071, -1742.9305145148,-3.6814974E-04,-4.3749170E-07, 2.1183885E-09, -9.8844667, 12.0539813334, 14286.1503796870,-6.0860358E-05, 6.2714140E-08,-1.9984990E-10, 8.7515625, 6.3563649081, -9652.8694498221,-9.0458282E-05,-1.7656429E-07, 8.3717626E-10,-8.3791067, 4.4137085761, -557.3142796331,-1.8540681E-04,-2.1843765E-07, 1.0319744E-09, -7.0026961, -3.1834384995,-16029.0808942018,-3.0728938E-04,-5.0020584E-07, 2.3182384E-09, 6.3220032, 9.1248177206, 16100.0685698171, 1.1921869E-04, 2.8238458E-07,-1.3407038E-09, 5.7508579, 6.2387797896, 17285.6848046987, 3.0196162E-04, 5.0143862E-07,-2.4271179E-09,-4.9501349, 9.6984267611, 5957.4589549619,-2.1317311E-04,-1.8769697E-07, 9.8648918E-10, -4.4211770, 3.0260949818, -209.5494658307, 4.3266809E-04, 5.1072212E-07,-2.4131116E-09, 4.1311145, 11.0674740526, 7004.5133996281, 2.1416722E-04, 3.2425793E-07,-1.5355019E-09, -3.9579827, 20.0522347225, 22128.5152003943,-2.8202511E-04,-1.2313366E-07, 6.2332010E-10,3.2582371, 14.8106422192, 14985.4400105508,-2.5159493E-04,-1.5449073E-07, 7.2324505E-10, -3.1483020, 4.8266068163, 16866.9323152810,-1.2804259E-04,-9.8998954E-09, 4.0433461E-11, 2.6164092, 14.2801588604, 24499.7476701576, 8.3460748E-05, 3.1497443E-07,-1.5495082E-09, 2.3536310, 9.5259240342, 8470.6667759558,-2.2382863E-04,-1.8523141E-07, 7.6873027E-10,-2.1171283, -0.8710096090, -7072.0875142282,-1.5764051E-04,-2.4917833E-07, 1.0774596E-09, -1.8970368, 17.6966801503, 13799.8237756692,-4.3433786E-04,-3.7354477E-07, 1.8096592E-09, -1.7385258, 2.0581540038, -8886.0057043583,-3.3771956E-04,-4.6884877E-07, 2.2183135E-09, -1.5713944, 22.4077892948, 30457.2066251194,-1.2971236E-04, 1.2727746E-07,-5.6301898E-10,-1.4225541, 24.7202181853, 39414.2000050930, 1.9936508E-05, 3.7830496E-07,-1.8037978E-09, -1.4189284, 17.1661967915, 23314.1314352759,-9.9282182E-05, 9.5920387E-08,-4.6309403E-10, 1.1655364, 3.8400995356, 9585.2953352221, 1.4698499E-04, 2.5164390E-07,-1.2952185E-09, -1.1169371, 10.9930146158, 33314.7656989005, 6.0925100E-04, 1.0016445E-06,-4.7453563E-09,1.0656723, 1.4845449633, 1256.6039104970,-5.3277630E-06, 1.2327842E-09,-1.0887946E-10, 1.0586190, 11.9220903668, 8364.7398411275,-2.1850087E-04,-1.8646419E-07, 8.7760973E-10, -0.9333176, 9.0816920389, 16728.3705250656, 1.1655481E-04, 2.8300097E-07,-1.3951435E-09, 0.8624328, 12.4550876470, 6656.7485858257,-4.0390768E-04,-4.0490184E-07, 1.9095841E-09,0.8512404, 4.3705828944, 70.9876756153,-1.8807069E-04,-2.1782126E-07, 9.7753467E-10, -0.8488018, 16.7219647962, 31571.8351843857, 2.4110126E-04, 5.6415276E-07,-2.6269678E-09, -0.7956264, 3.5134526588, -9095.5551701890, 9.4948529E-05, 4.1873358E-08,-1.9479814E-10} local M31{0.5139500, 12.0108556517, 14914.4523349355,-6.3524240E-05, 6.3330532E-08,-2.5428962E-10, 0.3824500, 9.6553010794, 6585.7609102104,-2.1583699E-04,-1.8708058E-07, 9.3204945E-10, 0.3265400, 3.9694765808, 7700.3894694766, 1.5497663E-04, 2.4979472E-07,-1.1318993E-09, 0.2639600, 0.7416325637, 8956.9933799736, 1.4964887E-04, 2.5102751E-07,-1.2407788E-09,0.1230200, -1.6139220085, 628.3019552485,-2.6638815E-06, 6.1639211E-10,-5.4439728E-11, 0.0775400, 8.7830116346, 16171.0562454324,-6.8852003E-05, 6.4563317E-08,-3.6316908E-10, 0.0606800, 6.4274570623, 7842.3648207073,-2.2116475E-04,-1.8584780E-07, 8.2317000E-10, 0.0497000, 12.0539813334, 14286.1503796870,-6.0860358E-05, 6.2714140E-08,-1.9984990E-10} --月球平黄经系数 local M1n{3.81034392032, 8.39968473021E03,-3.31919929753E-05,3.20170955005E-08,-1.53637455544E-10 }--日位置计算 --调用Enn前先设置EnnT时间变量 local EnnT0 --计算E10,E11,E20等,即:某一组周期项或泊松项算出,计算前先设置EnnT时间 local function Enn(F)local ilocal v0for i1,#F,3 dovvF[i]*math.cos(F[i1]EnnT*F[i2])--print(Fsize..#F, i..i, v..v, F[i]..F[i], m..math.cos(F[i1]EnnT*F[i2]))endreturn v end--返回地球位置,日心Date黄道分点坐标 local function earCal(jd)EnnTjd/365250--print(EnnT..EnnT)local llr{}local t1EnnTlocal t2t1*t1local t3t2*t1local t4t3*t1local t5t4*t1--print(t1..t1, t2..t2, t3..t3, t4..t4, t5..t5)llr[1] Enn(E10) Enn(E11)*t1 Enn(E12)*t2 Enn(E13)*t3 Enn(E14)*t4 Enn(E15)*t5--print(sppp)llr[2] Enn(E20) Enn(E21)*t1--print(eppp)llr[3] Enn(E30) Enn(E31)*t1 Enn(E32)*t2 Enn(E33)*t3llr[1]rad2mrad(llr[1])--print(llr[0]..llr[1], llr[1]..llr[2], llr[2]..llr[3])return llr end--传回jd时刻太阳的地心视黄经及黄纬 local function sunCal2(jd)--计算太阳真位置local sunearCal(jd)sun[1]sun[1] math.pisun[2]-sun[2]local dnutation(jd)--补章动sun[1]rad2mrad(sun[1]d.Lon)--补周年黄经光行差addGxc(jd,sun)--返回太阳视位置return sun end--月位置计算 --调用Mnn前先设置MnnT时间变量 local MnnT0 --计算M10,M11,M20等,计算前先设置MnnT时间 local function Mnn(F)local ilocal v0local t1MnnTlocal t2t1*t1local t3t2*t1local t4t3*t1for i1,#F,6 dovvF[i]*math.sin(F[i1] t1*F[i2] t2*F[i3] t3*F[i4] t4*F[i5])endreturn v end--返回月球位置,返回地心Date黄道坐标 local function moonCal(jd)MnnTjd/36525local t1MnnTlocal t2t1*t1local t3t2*t1local t4t3*t1local llr{}llr[1] (Mnn(M10) Mnn(M11)*t1 Mnn(M12)*t2)/radllr[2] (Mnn(M20) Mnn(M21)*t1)/radllr[3] (Mnn(M30) Mnn(M31)*t1)*0.999999949827llr[1] llr[1] M1n[1] M1n[2]*t1 M1n[3]*t2 M1n[4]*t3 M1n[5]*t4--地心Date黄道原点坐标(不含岁差)llr[1] rad2mrad(llr[1])--补岁差addPrece(jd,llr)return llr end--传回月球的地心视黄经及视黄纬 local function moonCal2(jd)local moonmoonCal(jd)local dnutation(jd)--补章动moon[1]rad2mrad(moon[1]d.Lon)return moon end--传回月球的地心视赤经及视赤纬 local function moonCal3(jd)local moonmoonCal(jd)HCconv(moon,hcjj1(jd))--补赤经及赤纬章动nutationRaDec(jd,moon)--如果黄赤转换前补了黄经章动及交章动,就不能再补赤经赤纬章动return moon end--地心坐标中的日月位置计算 local function jiaoCai(lx,t,jiao)--lx1时计算t时刻日月角距与jiao的差, lx0计算t时刻太阳黄经与jiao的差--计算太阳真位置(先算出日心坐标中地球的位置)local sunearCal(t)--转为地心坐标sun[1]sun[1] math.pisun[2]-sun[2]--补周年光行差addGxc(t,sun)--print(sun[1]..sun[1], sun[2]..sun[2])if lx0 then--补黄经章动local dnutation(t)sun[1]sun[1] d.Lonreturn rad2mrad(jiao-sun[1])else--日月角差与章动无关local moonmoonCal(t)return rad2mrad(jiao-(moon[1]-sun[1]))end end--已知位置反求时间 local function jiaoCal(t1,jiao,lx) --t1是J2000起算儒略日数--已知角度(jiao)求时间(t)--lx0是太阳黄经达某角度的时刻计算(用于节气计算)--lx1是日月角距达某角度的时刻计算(用于定朔望等)--传入的t1是指定角度对应真时刻t的前一些天--对于节气计算,应满足t在t1到t1360天之间,对于Y年第n个节气(n0是春分),t1可取值Y*365.2422n*15.2--对于朔望计算,应满足t在t1到t125天之间,在此范围之外,求右边的根local t2t1local t0local vif lx0 then--在t1到t2范围内求解(范气360天范围),结果置于tt2t2360elset2t225end--待搜索目标角jiaojiao*math.pi/180--利用截弦法计算--v1,v2为t1,t2时对应的黄经local v1jiaoCai(lx,t1,jiao)local v2jiaoCai(lx,t2,jiao)if v1v2 then--减2pi作用是将周期性角度转为连续角度v2v2 - 2*math.piend--k是截弦的斜率local k1local k2local i--快速截弦求根,通常截弦三四次就已达所需精度for i1,10 do--算出斜率k2(v2-v1)/(t2-t1)if math.abs(k2)1e-15 then--差商可能为零,应排除kk2end--直线逼近法求根(直线方程的根)tt1-v1/kvjiaoCai(lx,t,jiao)--一次逼近后,v1就已接近0,如果很大,则应减1周if v1 thenvv-2*math.piendif math.abs(v)1e-8 then--已达精度breakend--下一次截弦t1t2v1v2t2tv2vendreturn t end--节气计算--返回一年中各个节气的时间表从春分开始y是阳历的年分/北京时 local function jqFromChunFen(y)local ilocal jd365.2422*(y-2000)local qlocal jq {}for i0,23 do--计算第i个节气(i0是春分),结果转为北京时qjiaoCal(jdi*15.2,i*15,0)J20008/24--将节气时转成世界时JDate:setFromJD(q,1)jq[i1] JDate:JQ()endreturn jq end--返回一年的二十四个节气,从立春开始y是阳历的年分/北京时 local function jqFromLiChun(y)--上一年local jq1 jqFromChunFen(y-1)-- 当年local jq2 jqFromChunFen(y)local jq {}for i1,3 dojq[i] jq1[i21]endfor i1,21 dojq[i3] jq2[i]endreturn jq end--节气暂存用于快速查询 --初始化当前年份前后三年内的节气数据 local function jq3Y_Build()--取日期20230508local date_YYYYMMDD os.date(%Y%m%d)--取年: 2023local date_yos.date(%Y)--取月: 05local date_mos.date(%m)--取日: 08local date_dos.date(%d)local jq_lastYear jqFromChunFen(date_y-1)local jq_thisYear jqFromChunFen(date_y)local jq_nextYear jqFromChunFen(date_y1)local ifor i1,24 dojq3Y[i] jq_lastYear[i]jqN3Y[i] jqB[i]endfor i1,24 dojq3Y[24i] jq_thisYear[i]jqN3Y[24i] jqB[i]endfor i1,24 dojq3Y[48i] jq_nextYear[i]jqN3Y[48i] jqB[i]end end-- 以 jbB 为 base创建jqIdx查询字典用于快速查询某一给定的节气在jqB中的索引位置 local jqIdxDic{} local function jqIdxBuild()local idxfor idx1,#jqB dojqIdxDic[jqB[idx]] idxend end--根据指定的时间基准获取此时间之后的jq信息返回两个tabletimeList, nameList local function jqComming(t)local timeList {}local nameList {}t t or os.time()local tBase os.time()if type(t) type(tBase) thentBase tendtBase os.time()local tBaseStruct os.date(!*t,tBase)if tBase43200 then--校准tBase到00:00:00tBase os.time({yeartBaseStruct.year,monthtBaseStruct.month,daytBaseStruct.day,hour0})endlocal idxfor idx1,#jq3Y doif jq3Y[idx]tBase thentable.insert(timeList,jq3Y[idx])table.insert(nameList,jqN3Y[idx])endendreturn timeList,nameList end--获取给定的节气名称在 jbB中的索引位置这个主要用于查询某个关键字是否是一个节气名称 local function jqIdxByName(jqName)return jqIdxDic[jqName] or 0 end--根据给定的一个时间戳查询这天是否存在节气 local function jqInfoByTime(t)t t or os.time()local thisDay os.date(%Y%m%d,t)local idx 1for idx1,#jq3Y doif thisDay os.date(%Y%m%d,jq3Y[idx]) thenreturn jq3Y[idx],jqN3Y[idx]endendreturn 0, end--这个函数将建立节气列表用于节气信息的查询 local function jqListBuild()jq3Y_Build()jqIdxBuild() endlocal function test(printPrefix)if nil printPrefix thenprintPrefix end--调用引用模块的 test 方法--开始本模块的 test 方法print(printPrefix..test in lunarJieQiModule start)end--模块化封装 local M{} function M.init(...)--抛出功能函数M.jqListBuild jqListBuildM.jqFromChunFen jqFromChunFenM.jqComming jqCommingM.jqIdxByName jqIdxByNameM.jqInfoByTime jqInfoByTimeM.setDbg setDbgM.test test endM.init()return M以上的脚本中我们实现了计算二十四节气的功能并且整理出了一些函数方法例如计算当前日期开始的节气序列例如检索指定的节气信息等。这为下游的其它脚本提供了极大的便利。 lunarModule.lua lunarModule.lua 脚本实现了农历日期的计算lunarModule.lua文档的脚本如下 --此处获取农历的代码来自博客 --https://blog.csdn.net/BlueMustard/article/details/120907984local dbgFlg false--引入24节气计算模块 local ok, jq pcall(require, lunarjieQiModule)local function setDbg(flg,printPrefix)dbgFlg flgif nil printPrefix thenprintPrefix end--设置引用子模块的 dbgFlgjq.setDbg(flg, ..printPrefix)if flg thenprint(printPrefix..flg in lunarJieQiModule is true)end end--天干名称 local tianGan {甲,乙,丙,丁,戊,己,庚,辛,壬,癸} --地支名称 local diZhi {子,丑,寅,卯,辰,巳,午, 未,申,酉,戌,亥} --属相名称 local shengXiao {鼠,牛,虎,兔,龙,蛇, 马,羊,猴,鸡,狗,猪} --农历日期名 local lunarDayShuXu {初一,初二,初三,初四,初五,初六,初七,初八,初九,初十,十一,十二,十三,十四,十五,十六,十七,十八,十九,二十,廿一,廿二,廿三,廿四,廿五,廿六,廿七,廿八,廿九,三十}--农历月份名 local lunarMonthShuXu {正,二,三,四,五,六, 七,八,九,十,冬,腊}local daysToMonth365 {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334} local daysToMonth366 {0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335}--每个农历月所属的季节名称和季节符号表 local jiJieNames {春,春,春,夏,夏,夏,秋,秋,秋,冬,冬,冬} local jiJieLogos {,,,,,,,,,❄,❄,❄}--[[dateLunarInfo说明 自1901年起至2100年每年的农历信息与万年历核对完成 每年第1个数字为闰月月份 每年第2、3个数字为当年春节所在的阳历月份和日期 每年第4个数字为当年中对应月分的大小进左边起为1月往后依次为2月3月4月。。。]] local BEGIN_YEAR 1901 local NUMBER_YEAR 199 local dateLunarInfo {{0, 2, 19, 19168}, {0, 2, 8, 42352}, {5, 1, 29, 21096}, {0, 2, 16, 53856}, {0, 2, 4, 55632}, {4, 1, 25, 27304},{0, 2, 13, 22176}, {0, 2, 2, 39632}, {2, 1, 22, 19176}, {0, 2, 10, 19168}, {6, 1, 30, 42200}, {0, 2, 18, 42192},{0, 2, 6, 53840}, {5, 1, 26, 54568}, {0, 2, 14, 46400}, {0, 2, 3, 54944}, {2, 1, 23, 38608}, {0, 2, 11, 38320},{7, 2, 1, 18872}, {0, 2, 20, 18800}, {0, 2, 8, 42160}, {5, 1, 28, 45656}, {0, 2, 16, 27216}, {0, 2, 5, 27968},{4, 1, 24, 44456}, {0, 2, 13, 11104}, {0, 2, 2, 38256}, {2, 1, 23, 18808}, {0, 2, 10, 18800}, {6, 1, 30, 25776},{0, 2, 17, 54432}, {0, 2, 6, 59984}, {5, 1, 26, 27976}, {0, 2, 14, 23248}, {0, 2, 4, 11104}, {3, 1, 24, 37744},{0, 2, 11, 37600}, {7, 1, 31, 51560}, {0, 2, 19, 51536}, {0, 2, 8, 54432}, {6, 1, 27, 55888}, {0, 2, 15, 46416},{0, 2, 5, 22176}, {4, 1, 25, 43736}, {0, 2, 13, 9680}, {0, 2, 2, 37584}, {2, 1, 22, 51544}, {0, 2, 10, 43344},{7, 1, 29, 46248}, {0, 2, 17, 27808}, {0, 2, 6, 46416}, {5, 1, 27, 21928}, {0, 2, 14, 19872}, {0, 2, 3, 42416},{3, 1, 24, 21176}, {0, 2, 12, 21168}, {8, 1, 31, 43344}, {0, 2, 18, 59728}, {0, 2, 8, 27296}, {6, 1, 28, 44368},{0, 2, 15, 43856}, {0, 2, 5, 19296}, {4, 1, 25, 42352}, {0, 2, 13, 42352}, {0, 2, 2, 21088}, {3, 1, 21, 59696},{0, 2, 9, 55632}, {7, 1, 30, 23208}, {0, 2, 17, 22176}, {0, 2, 6, 38608}, {5, 1, 27, 19176}, {0, 2, 15, 19152},{0, 2, 3, 42192}, {4, 1, 23, 53864}, {0, 2, 11, 53840}, {8, 1, 31, 54568}, {0, 2, 18, 46400}, {0, 2, 7, 46752},{6, 1, 28, 38608}, {0, 2, 16, 38320}, {0, 2, 5, 18864}, {4, 1, 25, 42168}, {0, 2, 13, 42160}, {10, 2, 2, 45656},{0, 2, 20, 27216}, {0, 2, 9, 27968}, {6, 1, 29, 44448}, {0, 2, 17, 43872}, {0, 2, 6, 38256}, {5, 1, 27, 18808},{0, 2, 15, 18800}, {0, 2, 4, 25776}, {3, 1, 23, 27216}, {0, 2, 10, 59984}, {8, 1, 31, 27432}, {0, 2, 19, 23232},{0, 2, 7, 43872}, {5, 1, 28, 37736}, {0, 2, 16, 37600}, {0, 2, 5, 51552}, {4, 1, 24, 54440}, {0, 2, 12, 54432},{0, 2, 1, 55888}, {2, 1, 22, 23208}, {0, 2, 9, 22176}, {7, 1, 29, 43736}, {0, 2, 18, 9680}, {0, 2, 7, 37584},{5, 1, 26, 51544}, {0, 2, 14, 43344}, {0, 2, 3, 46240}, {4, 1, 23, 46416}, {0, 2, 10, 44368}, {9, 1, 31, 21928},{0, 2, 19, 19360}, {0, 2, 8, 42416}, {6, 1, 28, 21176}, {0, 2, 16, 21168}, {0, 2, 5, 43312}, {4, 1, 25, 29864},{0, 2, 12, 27296}, {0, 2, 1, 44368}, {2, 1, 22, 19880}, {0, 2, 10, 19296}, {6, 1, 29, 42352}, {0, 2, 17, 42208},{0, 2, 6, 53856}, {5, 1, 26, 59696}, {0, 2, 13, 54576}, {0, 2, 3, 23200}, {3, 1, 23, 27472}, {0, 2, 11, 38608},{11, 1, 31, 19176}, {0, 2, 19, 19152}, {0, 2, 8, 42192}, {6, 1, 28, 53848}, {0, 2, 15, 53840}, {0, 2, 4, 54560},{5, 1, 24, 55968}, {0, 2, 12, 46496}, {0, 2, 1, 22224}, {2, 1, 22, 19160}, {0, 2, 10, 18864}, {7, 1, 30, 42168},{0, 2, 17, 42160}, {0, 2, 6, 43600}, {5, 1, 26, 46376}, {0, 2, 14, 27936}, {0, 2, 2, 44448}, {3, 1, 23, 21936},{0, 2, 11, 37744}, {8, 2, 1, 18808}, {0, 2, 19, 18800}, {0, 2, 8, 25776}, {6, 1, 28, 27216}, {0, 2, 15, 59984},{0, 2, 4, 27424}, {4, 1, 24, 43872}, {0, 2, 12, 43744}, {0, 2, 2, 37600}, {3, 1, 21, 51568}, {0, 2, 9, 51552},{7, 1, 29, 54440}, {0, 2, 17, 54432}, {0, 2, 5, 55888}, {5, 1, 26, 23208}, {0, 2, 14, 22176}, {0, 2, 3, 42704},{4, 1, 23, 21224}, {0, 2, 11, 21200}, {8, 1, 31, 43352}, {0, 2, 19, 43344}, {0, 2, 7, 46240}, {6, 1, 27, 46416},{0, 2, 15, 44368}, {0, 2, 5, 21920}, {4, 1, 24, 42448}, {0, 2, 12, 42416}, {0, 2, 2, 21168}, {3, 1, 22, 43320},{0, 2, 9, 26928}, {7, 1, 29, 29336}, {0, 2, 17, 27296}, {0, 2, 6, 44368}, {5, 1, 26, 19880}, {0, 2, 14, 19296},{0, 2, 3, 42352}, {4, 1, 24, 21104}, {0, 2, 10, 53856}, {8, 1, 30, 59696}, {0, 2, 18, 54560}, {0, 2, 7, 55968},{6, 1, 27, 27472}, {0, 2, 15, 22224}, {0, 2, 5, 19168}, {4, 1, 25, 42216}, {0, 2, 12, 42192}, {0, 2, 1, 53584},{2, 1, 21, 55592}, {0, 2, 9, 54560}}--将给定的十进制数转为二进制字符串 local function dec2Bin(num)local str local tmp numwhile (tmp 0) doif (tmp % 2 1) thenstr str..1elsestr str..0endtmp math.modf(tmp / 2)endstr string.reverse(str)return str end--将给定的两个十进制数转换为两个长度相等的二进制字符串 local function dec2BinWithSameLen(num1, num2)local str1 dec2Bin(num1)local str2 dec2Bin(num2)local len1 string.len(str1)local len2 string.len(str2)local len 0local x 0--长度较短的字符串前方补零if (len1 len2) thenx len1 - len2for i 1, x dostr2 0..str2endlen len1elseif (len2 len1) thenx len2 - len1for i 1, x dostr1 0..str1endlen len2endlen len1return str1, str2, len end--将给定的两个十进制数进行按位与运算返回算结果 local function bitAnd(num1, num2)local str1, str2, len dec2BinWithSameLen(num1, num2)local rtmp for i 1, len dolocal st1 tonumber(string.sub(str1, i, i))local st2 tonumber(string.sub(str2, i, i))if(st1 0) thenrtmp rtmp..0elseif (st2 ~ 0) thenrtmp rtmp..1elsertmp rtmp..0endendendreturn tonumber(rtmp,2) end--判断所在年份是否为闰年 local function IsLeapYear(solarYear)if solarYear%4 ~ 0 thenreturn 0endif solarYear%100 ~ 0 thenreturn 1endif solarYear%400 0 thenreturn 1endreturn 0 endlocal function getYearInfo(lunarYear,index)if lunarYear BEGIN_YEAR or lunarYear BEGIN_YEAR NUMBER_YEAR - 1 thenreturnendreturn dateLunarInfo[lunarYear-19011][index] end--计算指定公历日期是这一年中的第几天 local function daysCntInSolar(solarYear,solarMonth,solarDay)local daysToMonth daysToMonth365if solarYear % 4 0 thenif solarYear % 100 ~ 0 thendaysToMonth daysToMonth366endif solarYear % 400 0 thendaysToMonth daysToMonth366endendreturn daysToMonth[solarMonth] solarDay end--[[根据指定的阳历日期返回一个农历日期的结构体结构如下 lunarDate.solarYear对应的阳历日期年份 lunarDate.solarMonth对应的阳历日期月份 lunarDate.solarDay对应的阳历日期日期 lunarDate.solarDate_YYYYMMDD对应的阳历日期 YYYYMMDD lunarDate.year对应农历年份 lunarDate.month对应农历月份 lunarDate.day对应农历的日期 lunarDate.leap是否为农历的闰年 lunarDate.year_shengXiao用生肖表示的农历年份 lunarDate.year_ganZhi用干支表示的农历年份 lunarDate.month_shuXu农历月份的名称 lunarDate.month_ganZhi用干支表示的农历月份 lunarDate.day_shuXu农历日期的名称 lunarDate.day_ganZhi用干支表示的农历日期 lunarDate.lunarDate_YYYYMMDD以 YYYYMMDD 格式表示的农历日期 lunarDate.lunarDate_1癸卯年四月十一 lunarDate.lunarDate_2兔年四月十一 lunarDate.lunarDate_3癸卯年四月丁亥日 lunarDate.lunarDate_4癸卯(兔)年四月十一 lunarDate.jiJieName: 日期所属的季节名称 lunarDate.jiJieLogo日期所属的季节的符号 ]] --阳历转阴历 local function solar2Lunar(solarYear,solarMonth,solarDay)local lunarDate {}lunarDate.solarYear solarYearlunarDate.solarMonth solarMonthlunarDate.solarDay solarDaylunarDate.solarDatelunarDate.solarDate_YYYYMMDD lunarDate.yearsolarYearlunarDate.month0lunarDate.day0lunarDate.leapfalselunarDate.year_shengXiaolunarDate.year_ganZhilunarDate.month_shuXulunarDate.month_ganZhilunarDate.day_shuXulunarDate.day_ganZhilunarDate.lunarDate_YYYYMMDDlunarDate.lunarDate_1lunarDate.lunarDate_2lunarDate.lunarDate_3lunarDate.lunarDate_4lunarDate.jiJieName lunarDate.jiJieLogo --确定当前日期相对于2000年1月7日的天数此日期是一个甲子记日的起点local tBase os.time({year2000,month1,day7})local tThisDay os.time({yearmath.min(solarYear,2037),monthsolarMonth,daysolarDay})lunarDate.daysToBase math.floor((tThisDay-tBase)/86400)lunarDate.solarDate_YYYYMMDD os.date(%Y%m%d,tThisDay)if lunarDate.solarYear BEGIN_YEAR or lunarDate.solarYear BEGIN_YEAR NUMBER_YEAR- 1 thenreturn lunarDateend--春节的公历日期local solarMontSpring getYearInfo(lunarDate.year,2)local solarDaySpring getYearInfo(lunarDate.year,3)--计算这天是公历年的第几天local daysCntInSolarThisDate daysCntInSolar(solarYear, solarMonth, solarDay)--计算春节是公历年的第几天local daysCntInSolarSprint daysCntInSolar(solarYear, solarMontSpring, solarDaySpring)--计算这天是农历年的第几天local daysCntInLunarThisDate daysCntInSolarThisDate - daysCntInSolarSprint 1if daysCntInLunarThisDate 0 then--如果 daysCntInLunarThisDate 为负说明指定的日期在农历中位于上一年的年度内lunarDate.year lunarDate.year-1if lunarDate.year BEGIN_YEAR thenreturn lunar_dateend--重新确定农历春节所在的公历日期solarMontSpring getYearInfo(lunarDate.year,2)solarDaySpring getYearInfo(lunarDate.year,3)--重新计算上一年春节是第几天daysCntInSolarSprint daysCntInSolar(solarYear-1, solarMontSpring, solarDaySpring)--计算上一年共几天local daysCntInSolarTotal daysCntInSolar(solarYear-1, 12, 31)--上一年农历年的第几天daysCntInLunarThisDate daysCntInSolarThisDate daysCntInSolarTotal - daysCntInSolarSprint 1end--开始计算月份local lunarMonth 1local lunarDaysCntInMonth 0--dec 32768 bin 1000000000000000一个掩码local bitMask 32768--大小月份的flg数据local lunarMonth30Flg getYearInfo(lunarDate.year,4)--从正月开始每个月进行以下计算while lunarMonth 13 do--计算这个月总共有多少天if bitAnd(lunarMonth30Flg,bitMask) ~ 0 thenlunarDaysCntInMonth 30elselunarDaysCntInMonth 29end--检查thisDate距离这个月初一的天数是否小于这个月的总天数if daysCntInLunarThisDate lunarDaysCntInMonth thenlunarDate.month lunarMonthlunarDate.day daysCntInLunarThisDatebreakelse--如果剩余天数还大于这个月的天数则继续往下个月算daysCntInLunarThisDate daysCntInLunarThisDate - lunarDaysCntInMonthlunarMonth lunarMonth 1--掩码除2相当于bit位向右移动一位bitMask bitMask/2endend--闰月所在的月份local leapMontInLunar getYearInfo(lunarDate.year,1)--确定闰月信息if leapMontInLunar 0 and leapMontInLunar lunarDate.month then--如果存在闰月且闰在前面判断的月份前面则农历月份需要减 1 处理lunarDate.month lunarDate.month - 1if leapMontInLunar lunarDate.month then--如果恰好闰在这个月则把闰月标记位置lunarDate.leap trueendend--合成农历的年月日格式20240215local tmpMonthStr 0..lunarDate.monthtmpMonthStr string.sub(tmpMonthStr,(#tmpMonthStr3 and 1 or 2),(#tmpMonthStr3 and 2 or 3))local tmpDayStr 0..lunarDate.daytmpDayStr string.sub(tmpDayStr,(#tmpDayStr3 and 1 or 2),(#tmpDayStr3 and 2 or 3))lunarDate.lunarDate_YYYYMMDD lunarDate.year..tmpMonthStr..tmpDayStrlunarDate.jiJieName jiJieNames[lunarDate.month]lunarDate.jiJieLogo jiJieLogos[lunarDate.month]--确定年份的生肖lunarDate.year_shengXiao shengXiao[(((lunarDate.year - 4) % 60) % 12) 1]--确定年份的干支lunarDate.year_ganZhi tianGan[(((lunarDate.year - 4) % 60) % 10)1]..diZhi[(((lunarDate.year - 4) % 60) % 12) 1]--确定月份的数序lunarDate.month_shuXu (lunarDate.leap and 闰 or )..lunarMonthShuXu[lunarDate.month]--确定月份的干支暂不支持计算lunarDate.month_ganZhi --确定日期的数序lunarDate.day_shuXu lunarDayShuXu[lunarDate.day]--确定日期的干支lunarDate.day_ganZhi tianGan[(((lunarDate.daysToBase) % 60) % 10)1]..diZhi[(((lunarDate.daysToBase) % 60) % 12) 1]--提供国标第一类计年表示格式lunarDate.lunarDate_1 lunarDate.year_ganZhi..年..lunarDate.month_shuXu..月..lunarDate.day_shuXu--提供国标第二类计年表示格式lunarDate.lunarDate_2 lunarDate.year_shengXiao..年..lunarDate.month_shuXu..月..lunarDate.day_shuXu--提供国标第三类计年表示格式lunarDate.lunarDate_3 lunarDate.year_ganZhi..年..lunarDate.month_shuXu..月..lunarDate.day_ganZhi..日--提供非国标的第四类计年表示格式lunarDate.lunarDate_4 lunarDate.year_ganZhi..(..lunarDate.year_shengXiao..)年..lunarDate.month_shuXu..月..lunarDate.day_shuXureturn lunarDate end--通过传入的阳历时间返回一个阴历数据结构 local function solar2LunarByTime(t)local solarDate os.date(*t,t)return solar2Lunar(solarDate.year,solarDate.month,solarDate.day) end--抛出 农历节气 信息今年自今天起未来的 农历节气 信息 local function jqListComming(t)t t or os.time()local timeBase os.time()if type(t) type(timeBase) thentimeBase tendlocal lunarList {}local jqList {}local timeList {}--获取 timeBase开始的农历信息local jqTimeList, jqNameList jq.jqComming(timeBase)--整理未来的节气信息local idxlocal thisY,thisM,thisD,thisYLlocal thisLunarDatelocal jqNamelocal jqTimefor idx1,#jqTimeList dojqName jqNameList[idx]jqTime jqTimeList[idx]if jqName ~ jqToday thenthisY tonumber(os.date(%Y,jqTime))thisM tonumber(os.date(%m,jqTime))thisD tonumber(os.date(%d,jqTime))thisLunarDate solar2Lunar(thisY,thisM,thisD)table.insert(lunarList,thisLunarDate.lunarDate_4)table.insert(jqList,jqName)table.insert(timeList,jqTime)endend--输出 lunar 信息return lunarList,jqList,timeList end--[[根据指定的节气名整理并输出这个节气的信息节气的信息是个如下的结构体 jqInfo.jqName节气的名称 jqInfo.jqTimeList节气的时间序列 jqInfo.lunarList节气的农历日期序列 ]] local function jqInfoByName(jqN)local jqInfo {}jqInfo.jqName jqN or jqInfo.jqTimeList {}jqInfo.lunarList {}if jqInfo.jqName thenreturn jqInfoend--以 0 为参数获取所有的节气信息local jqTimeList, jqNameList jq.jqComming(0)local idx 0for idx1,#jqNameList doif jqNameList[idx] jqInfo.jqName thentable.insert(jqInfo.jqTimeList, jqTimeList[idx])local thisLunarDate solar2LunarByTime(jqTimeList[idx])table.insert(jqInfo.lunarList, thisLunarDate.lunarDate_4)endendreturn jqInfo end--这是测试函数 local function test(printPrefix)if nil printPrefix thenprintPrefix end--调用引用模块的 test 方法res.test( ..printPrefix)--开始本模块的 test 方法print(printPrefix..test in lunarModule start)local idxlocal lunarList,jqList,timeList jqListComming()print(printPrefix..idx\tlunar\t\t\t\tjqName\t\t\t\tdateYL)for idx1,#lunarList doprint(printPrefix..idx..\t..lunarList[idx]..\t\t..jqList[idx]..\t\t..os.date(%Y%m%d,timeList[idx]))end end--模块化封装 local M{} function M.init(...)--抛出功能函数M.jqListBuild jq.jqListBuildM.jqIdxByName jq.jqIdxByNameM.jqInfoByTime jq.jqInfoByTimeM.jqListComming jqListCommingM.solar2LunarByTime solar2LunarByTimeM.jqInfoByName jqInfoByNameM.setDbg setDbgM.test test endM.init()return M以上代码引用了上文中的 lunarjieQiModule.lua 脚本内的二十四节气相关模块。并整合了自身所提供了的农历日期信息封装成了 lunarModule 模块进一步为下游脚本提供了引用的便利。 事件信息 为了在输入事件关键字时检索显示出对应的事件信息或者在合适的日期显示有关的事件我们需要实现事件的记录和管理并提供事件和日期之间映射的检索方法。为此我们需要以下 eventsList.txt 和 eventsListModule.lua 两个文档。 eventsList.txt eventsList.txt 文档是一个事件和时间信息的映射列表这个文档提供了事件和时间映射关系的管理接口。eventsList.txt 文档内容截取如下 # 常备节日信息这里一般维护周期性的相对比较稳定的事件/节日信息例如每年 or 每月都会发生的事件 [lunar][Y][M01]-1 春节 过年 (中国)除夕 [lunar][Y]0101 春节 过年 (中国)春节 [solar][Y]0101 元旦 (中国)元旦休3天 [solar][Y]0110 警察 (中国)警察节eventsList.txt 文档内容分三列以tab制表符分隔三列数据分述如下 第一列是时间定义关于时间的定义格式暂不成熟暂不多表第二列是事件关键字可以有多个关键字多关键字以空格分隔滤镜将会响应命中的关键字第三列是事件内容即将要显示在候选项comment区的内容 eventsListModule.lua eventsListModule.lua 脚本文档提供了将 eventsList.txt 中所列事件加载为lua 字典对象的方法并提供一些检索的接口。eventsListModule.lua 脚本内容如下 -- eventsListModule.lua -- Copyright (C) 2023 yaoyuan.dou douyaoyuan126.com local M{} local dbgFlg false --按照公历日期建立的事件索引表 local eventsDicBySolarDates{} --按照关键字建立的事件索引表 local eventsDicListByKeyW{}--[[事件是一个结构体每一个事件的结构如下 e.c1文档第一列的内容 e.c2文档第二列的内容如果没有内容此为空 e.c3文档第三列的内容如果没有内容此为空 e.kWs这是文档第二列的内容通过空格切分后的关键字列表 e.time这是事件的时间值 e.solarDate这是事件的日期20230102 ]]--一个农历日期表用于根据农历反查对应阳历时间提高查询效率 local lunarDatesList {}--引入系统变更处理模块 local ok, sysInfoRes pcall(require, sysInfo)--引入农历计算模块 local ok, lunar pcall(require, lunarModule)--引入日期时间计算模块 local ok, dt pcall(require,dateTimeModule)--设置 dbg 开关 local function setDbg(flg)flg flg or dbgFlgdbgFlg flgsysInfoRes.setDbg(flg)lunar.setDbg(flg)dt.setDbg(flg)print(eventsListModule dbgFlg is ..tostring(dbgFlg)) end--将这附串拆散成 table local function stringSplit(str,sp,sp1)sp(type(sp)string) and sp or if 0#sp thensp([%z\1-\127\194-\244][\128-\191]*)elseif 1#sp thensp[^..(sp% and %% or sp)..]*elsesp1sp1 or ^strstr:gsub(sp,sp1)sp[^..sp1..]*endlocal tab{}for v in str:gmatch(sp) doif ~v thentable.insert(tab,v)endendreturn tab end--将一个日期字符串转换为时间值20230125 - xxxxxx local function dateStr2Time(dateStr)dateStr dateStr or if #dateStr ~ 8 thendateStr os.date(%Y%m%d)endlocal year tonumber(string.sub(dateStr,1,4))local month tonumber(string.sub(dateStr,5,6))local day tonumber(string.sub(dateStr,7,8))return os.time({yearyear,monthmonth,dayday}) end--根据指定的天数偏移量建立农历日期序列表以借后期快速查询农历对应的阳历日期 local function lunarDatesListBuild(preDays,posDays)if nil preDays thenpreDays 100endif nil posDays thenposDays 365endpreDays math.max(preDays,1)posDays math.max(posDays,1)local idx 0local todayTime os.date(*t)local tmpLunar,tmpSolar,tmpTime--以昨天为base计算前preDays日期内的日期序列for idx 1, preDays dotmpTime os.time({yeartodayTime.year,monthtodayTime.month,daytodayTime.day - idx})tmpSolar os.date(%Y%m%d,tmpTime)tmpLunar lunar.solar2LunarByTime(tmpTime)lunarDatesList[tmpLunar.lunarDate_YYYYMMDD..(tmpLunar.leap and .1 or .0)] tmpSolarend--以今天为base计算后posDays日期内的日期序列for idx 0, posDays dotmpTime os.time({yeartodayTime.year,monthtodayTime.month,daytodayTime.day idx})tmpSolar os.date(%Y%m%d,tmpTime)tmpLunar lunar.solar2LunarByTime(tmpTime)lunarDatesList[tmpLunar.lunarDate_YYYYMMDD..(tmpLunar.leap and .1 or .0)] tmpSolarend end--以指定时间为基准计算并把该基准前 or 后指定周数的周序对应的时间值 local function timeOfWeekDayBaseOnTime0(t,wCnt,wCntType,wDay)t t or os.time()local tBase os.time()if type(t)type(tBase) thentBase tendwCnt wCnt or 0if 0wCnt thenwCnt 1endwCntType wCntType or wif w~wCntType and W~wCntType thenwCntType wendwDay wDay or 0if wDay 0 or wDay 6 thenwDay 0endlocal fakeSolarDateTime tBaselocal fakeSolarDate_wDay tonumber(os.date(%w,fakeSolarDateTime))if wCnt 0 then--找描点之后第 wCnt 周的位置if fakeSolarDate_wDay wDay thenfakeSolarDateTimefakeSolarDateTime(wDay-fakeSolarDate_wDay7*(wCnt-1))*86400if WwCntType and 0~fakeSolarDate_wDay then--如果要求整周且初一不为周日则需要额外加7天fakeSolarDateTime fakeSolarDateTime 7*86400endelsefakeSolarDateTimefakeSolarDateTime(wDay-fakeSolarDate_wDay7*wCnt)*86400endelse--找描点之前第 wCnt 周的位置if fakeSolarDate_wDay wDay thenfakeSolarDateTime fakeSolarDateTime (wDay-fakeSolarDate_wDay7*wCnt)*86400elsefakeSolarDateTime fakeSolarDateTime (wDay-fakeSolarDate_wDay7*(wCnt1))*86400if WwCntType and 0~fakeSolarDate_wDay then--如果要求整周且初一不为周日则需要额外减7天fakeSolarDateTime fakeSolarDateTime - 7*86400endendendreturn fakeSolarDateTime end--[[对传入的锚点信息进行解码[solar][Y]0315 函数返回一个锚点结构体说明如下 anchor.desc锚点的描述 anchor.lunarFlg锚点是否 base农历 anchor.solarFlg锚点是否 base公历 anchor.yearFlg锚点是否以 年 为循环周期 anchor.monthFlg锚点是否以 月 为循环周期 anchor.weekFlg锚点是否以 周 为循环周期 anchor.dayFlg锚点是否为指定日期事件 anchor.jqFlg锚点是否 base节气 anchor.eventFlg锚点是否 base事件 anchor.solarDatesList锚点解析的事件日期序列 ]] local function anchorDecode(anchorStr)local anchor {}anchor.desc anchor.lunarFlg falseanchor.solarFlg falseanchor.yearFlg falseanchor.monthFlg falseanchor.weekFlg falseanchor.dayFlg falseanchor.jqFlg falseanchor.eventFlg falseanchor.solarDatesList {}anchorStr anchorStr or if anchorStr thenreturn anchorendanchor.desc anchorStr--1.1解码公历指定日期的事件dolocal solarDate string.match(anchor.desc,%[solar%]%[D%](%d%d%d%d%d%d%d%d))if nil ~ solarDate thentable.insert(anchor.solarDatesList,solarDate)anchor.solarFlg trueanchor.dayFlg truereturn anchorendend--2.1/2解码农历指定日期的事件dolocal lunarDate string.match(anchor.desc,%[lunar%]%[D%](%d%d%d%d%d%d%d%d))if nil ~ lunarDate thenlocal solarDateOfThisLunarDateif string.find(anchor.desc,lunarDate..%.1) then--这是一个带有.1标记的农历日期solarDateOfThisLunarDate lunarDatesList[lunarDate...1]else--这是一个没有.1标记的农历日期solarDateOfThisLunarDate lunarDatesList[lunarDate...0]endif nil ~ solarDateOfThisLunarDate thentable.insert(anchor.solarDatesList,solarDateOfThisLunarDate)anchor.lunarFlg trueanchor.dayFlg trueendreturn anchorendend--3.1/2/3解码周循环事件dolocal weekDay string.match(anchor.desc,%[solar%]%[[Ww]%]([0-9])$)if nil weekDay thenweekDay string.match(anchor.desc,%[lunar%]%[[Ww]%]([0-6])$)endif nil ~ weekDay thenweekDay tonumber(weekDay)if weekDay6 thenweekDay nilendendif nil ~ weekDay then--获取今天的周序值距离周日的天数local daysToSundayToday tostring(os.date(%w))local timeBase os.date(*t)timeBase.day timeBase.day weekDay - daysToSundayTodaylocal tmpTimelocal idx--前查5周的日期local preWs 5--后查10周的日期local posWs 10for idx 1,preWs dotmpTime os.date(*t,os.time(timeBase))tmpTime.day tmpTime.day - 7*(preWs-idx1)table.insert(anchor.solarDatesList,os.date(%Y%m%d,os.time(tmpTime)))endfor idx 0,posWs dotmpTime os.date(*t,os.time(timeBase))tmpTime.day tmpTime.day 7*idxtable.insert(anchor.solarDatesList,os.date(%Y%m%d,os.time(tmpTime)))endif 0#anchor.solarDatesList thenanchor.solarFlg trueanchor.weekFlg trueendreturn anchorendend--4.1/2解码公历月循环事件dolocal daysOffset string.match(anchor.desc,%[solar%]%[[Mm]%](-*[0-9])$)if nil ~ daysOffset thendaysOffset tonumber(daysOffset)if 0daysOffset or daysOffset-31 or daysOffset31 thendaysOffset nilendendif nil ~ daysOffset thenlocal timeBase os.date(*t)timeBase os.time({yeartimeBase.year,monthtimeBase.month,day1})local fakeTimelocal anchorMonthlocal idx--前查12个月的日期local preMs 12--后查12个月的日期local posMs 10for idx 1,preMs dofakeTime os.date(*t,timeBase)fakeTime.month fakeTime.month - (preMs-idx1)local t os.time(fakeTime)anchorMonth tonumber(os.date(%m,t))t t (daysOffset-(daysOffset0 and 1 or 0))*86400if daysOffset 0 thenif tonumber(os.date(%m,t)) anchorMonth thentable.insert(anchor.solarDatesList,os.date(%Y%m%d,t))endelseif daysOffset 0 thenif tonumber(os.date(%m,t)) (anchorMonth1 and 12 or anchorMonth-1) thentable.insert(anchor.solarDatesList,os.date(%Y%m%d,t))endendendfor idx 0,posMs dofakeTime os.date(*t,timeBase)fakeTime.month fakeTime.month idxlocal t os.time(fakeTime)anchorMonth tonumber(os.date(%m,t))t t (daysOffset-(daysOffset0 and 1 or 0))*86400if daysOffset 0 thenif tonumber(os.date(%m,t)) anchorMonth thentable.insert(anchor.solarDatesList,os.date(%Y%m%d,t))endelseif daysOffset 0 thenif tonumber(os.date(%m,t)) (anchorMonth1 and 12 or anchorMonth-1) thentable.insert(anchor.solarDatesList,os.date(%Y%m%d,t))endendendif 0#anchor.solarDatesList thenanchor.solarFlg trueanchor.monthFlg trueendreturn anchorendend--5.1/2解码农历月循环事件dolocal daysOffset string.match(anchor.desc,%[lunar%]%[[Mm]%](-*[0-9])$)if nil ~ daysOffset thendaysOffset tonumber(daysOffset)if 0daysOffset or daysOffset-31 or daysOffset31 thendaysOffset nilendendif nil ~ daysOffset thenlocal lunarYear tonumber(os.date(%Y))local fakeLunarDatesList {}--合成去年1-9月度的月度字符串for idx 1,9 dotable.insert(fakeLunarDatesList,(lunarYear-1)..0..idx..01.0)end--合成去年10-12月度的月度字符串for idx 10,12 dotable.insert(fakeLunarDatesList,(lunarYear-1)..idx..01.0)end--合成今年1-9月度的月度字符串for idx 1,9 dotable.insert(fakeLunarDatesList,lunarYear..0..idx..01.0)end--合成今年10-12月度的月度字符串for idx 10,12 dotable.insert(fakeLunarDatesList,lunarYear..idx..01.0)end--合成明年1-9月度的月度字符串for idx 1,9 dotable.insert(fakeLunarDatesList,(lunarYear1)..0..idx..01.0)end--合成明年10-12月度的月度字符串for idx 10,12 dotable.insert(fakeLunarDatesList,(lunarYear1)..idx..01.0)endlocal fakeSolarDatefor idx1,#fakeLunarDatesList dofakeSolarDate lunarDatesList[fakeLunarDatesList[idx]]local t dateStr2Time(fakeSolarDate)local anchorMonth tonumber(string.sub(fakeLunarDatesList[idx],5,6))t t (daysOffset-(daysOffset0 and 1 or 0))*86400local lunarCheck lunar.solar2LunarByTime(t)if daysOffset0 thenif anchorMonth lunarCheck.month and falselunarCheck.leap thentable.insert(anchor.solarDatesList,os.date(%Y%m%d,t))endelseif daysOffset0 thenif lunarCheck.month(anchorMonth1 and 12 or anchorMonth-1) thentable.insert(anchor.solarDatesList,os.date(%Y%m%d,t))endendendif 0#anchor.solarDatesList thenanchor.lunarFlg trueanchor.monthFlg trueendreturn anchorendend--6.1解码农历年循环事件dolocal lunarYearMonth string.match(anchor.desc,%[lunar%]%[[Yy]%](%d%d%d%d))if nil ~ lunarYearMonth thenlocal lm,ld string.match(anchor.desc,%[lunar%]%[Y%](%d%d)(%d%d))local ly tonumber(os.date(%Y))--预查前2年后2年以及本年的农历日期不考虑闰月local fakeLunarDatesList {(ly-2)..lm..ld...0,(ly-1)..lm..ld...0,(ly-0)..lm..ld...0,(ly1)..lm..ld...0,(ly2)..lm..ld...0}local thisSolarDatefor idx 1,#fakeLunarDatesList dothisSolarDate lunarDatesList[fakeLunarDatesList[idx]]if nil ~ thisSolarDate thentable.insert(anchor.solarDatesList,thisSolarDate)endendif 0#anchor.solarDatesList thenanchor.lunarFlg trueanchor.yearFlg trueendreturn anchorendend--7.1解码公历年循环事件dolocal solarYearMonth string.match(anchor.desc,%[solar%]%[[Yy]%](%d%d%d%d))if nil ~ solarYearMonth thenlocal m,d string.match(anchor.desc,%[solar%]%[Y%](%d%d)(%d%d))local y tonumber(os.date(%Y))local fakeDateStr--定义去年的事件fakeDateStr (y - 1)..m..dif fakeDateStr os.date(%Y%m%d,dateStr2Time(fakeDateStr)) thentable.insert(anchor.solarDatesList,fakeDateStr)end--定义今年的事件fakeDateStr y..m..dif fakeDateStr os.date(%Y%m%d,dateStr2Time(fakeDateStr)) thentable.insert(anchor.solarDatesList,fakeDateStr)end--定义明年的事件fakeDateStr (y 1)..m..dif fakeDateStr os.date(%Y%m%d,dateStr2Time(fakeDateStr)) thentable.insert(anchor.solarDatesList,fakeDateStr)endif 0#anchor.solarDatesList thenanchor.solarFlg trueanchor.yearFlg trueendreturn anchorendend--8.1/2解码锚定在农历月份指定周序上的事件--[lunar][Y][M05][1Ww]4dolocal anchorLunarMonth,anchorWCnt,anchorWType,anchorWDay string.match(anchor.desc,%[[Ll]unar%]%[[Yy]%]%[[Mm]([0-9])%]%[(-*[0-9])([Ww])%]([0-9])$)if nil~anchorLunarMonth and nil~anchorWCnt and nil~anchorWType and nil~anchorWDay thenanchorLunarMonth tonumber(anchorLunarMonth)if anchorLunarMonth1 or anchorLunarMonth12 thenanchorLunarMonth nilelseif anchorLunarMonth10 thenanchorLunarMonth 0..anchorLunarMonthelseanchorLunarMonth tostring(anchorLunarMonth)endanchorWCnt tonumber(anchorWCnt)if 0anchorWCnt thenanchorWCnt nilendanchorWDay tonumber(anchorWDay)if anchorWDay0 or anchorWDay6 thenanchorWDay nilendendif nil~anchorLunarMonth and nil~anchorWCnt and nil~anchorWType and nil~anchorWDay thenlocal fakeLunarYear 0local fakeSolarDate local fakeSolarDateTime local fakeLunarDate local idx 0--处理去年今年明天三年内的事件for idx1,3 dofakeLunarYear tonumber(os.date(%Y))(idx-2)--找到农历对应月的初一做为基准日期fakeLunarDate fakeLunarYear..anchorLunarMonth..01.0fakeSolarDate lunarDatesList[fakeLunarDate]if nil ~ fakeSolarDate thentable.insert(anchor.solarDatesList,os.date(%Y%m%d,timeOfWeekDayBaseOnTime0(dateStr2Time(fakeSolarDate),anchorWCnt,anchorWType,anchorWDay)))endendif 0#anchor.solarDatesList thenanchor.lunarFlg trueanchor.yearFlg trueendreturn anchorendend--9.1/2解码锚定在公历月份指定周序上的事件--[solar][Y][M05][1Ww]4dolocal anchorSolarMonth,anchorWCnt,anchorWType,anchorWDay string.match(anchor.desc,%[[Ss]olar%]%[[Yy]%]%[[Mm]([0-9])%]%[(-*[0-9])([Ww])%]([0-9])$)if nil~anchorSolarMonth and nil~anchorWCnt and nil~anchorWType and nil~anchorWDay thenanchorSolarMonth tonumber(anchorSolarMonth)if anchorSolarMonth1 or anchorSolarMonth12 thenanchorSolarMonth nilelseif anchorSolarMonth10 thenanchorSolarMonth 0..anchorSolarMonthelseanchorSolarMonth tostring(anchorSolarMonth)endanchorWCnt tonumber(anchorWCnt)if 0anchorWCnt thenanchorWCnt nilendanchorWDay tonumber(anchorWDay)if anchorWDay0 or anchorWDay6 thenanchorWDay nilendendif nil~anchorSolarMonth and nil~anchorWCnt and nil~anchorWType and nil~anchorWDay thenlocal fakeSolarYear 0local fakeSolarDate local fakeSolarDateTime local idx 0--处理去年今年明天三年内的事件for idx1,3 dofakeSolarYear tonumber(os.date(%Y))(idx-2)--以每指定月的1号作为指定的基准日期fakeSolarDate fakeSolarYear..anchorSolarMonth..01if nil ~ fakeSolarDate thentable.insert(anchor.solarDatesList,os.date(%Y%m%d,timeOfWeekDayBaseOnTime0(dateStr2Time(fakeSolarDate),anchorWCnt,anchorWType,anchorWDay)))endendif 0#anchor.solarDatesList thenanchor.solarFlg trueanchor.yearFlg trueendreturn anchorendend--10.1/2/3/4解码锚定在节气上的指定周序上的事件--[lunar][Y][JQ清明][1w]4dolocal anchorJqName,anchorWCnt,anchorWType,anchorWDay string.match(anchor.desc,%[[Ll]unar%]%[[Yy]%]%[[Jj][Qq](.)%]%[(-*[0-9])([Ww])%]([0-9])$)if nil~anchorJqName and nil~anchorWCnt and nil~anchorWType and nil~anchorWDay thenif 0lunar.jqIdxByName(anchorJqName) thenanchorJqName nilendanchorWCnt tonumber(anchorWCnt)if 0anchorWCnt thenanchorWCnt nilendanchorWDay tonumber(anchorWDay)if anchorWDay0 or anchorWDay6 thenanchorWDay nilendendif nil~anchorJqName and nil~anchorWCnt and nil~anchorWType and nil~anchorWDay thenlocal jqInfo lunar.jqInfoByName(anchorJqName)if #jqInfo.jqTimeList0 thenlocal idxfor idx 1,#jqInfo.jqTimeList do--以每一个节气的时间为指定的基准时间table.insert(anchor.solarDatesList,os.date(%Y%m%d,timeOfWeekDayBaseOnTime0(jqInfo.jqTimeList[idx],anchorWCnt,anchorWType,anchorWDay)))endendif 0#anchor.solarDatesList thenanchor.lunarFlg trueanchor.yearFlg trueanchor.jqFlg trueendreturn anchorendend--11.1/2/3/4解码锚定在公历每月指定周序上的事件--[solar][M][2w]2dolocal anchorWCnt,anchorWType,anchorWDay string.match(anchor.desc,%[[Ss]olar%]%[[Mm]%]%[(-*[0-9])([Ww])%]([0-9])$)if nil~anchorWCnt and nil~anchorWType and nil~anchorWDay thenanchorWCnt tonumber(anchorWCnt)if 0anchorWCnt thenanchorWCnt nilendanchorWDay tonumber(anchorWDay)if anchorWDay0 or anchorWDay6 thenanchorWDay nilendendif nil~anchorWCnt and nil~anchorWType and nil~anchorWDay thenlocal solarDateBase os.date(*t)solarDateBase os.date(*t,os.time({yearsolarDateBase.year,monthsolarDateBase.month,day1}))local idx 0local fakeSolarDatefor idx1,24 dofakeSolarDate os.date(*t,os.time(solarDateBase))fakeSolarDate.month fakeSolarDate.month (idx - 13)table.insert(anchor.solarDatesList,os.date(%Y%m%d,timeOfWeekDayBaseOnTime0(os.time(fakeSolarDate),anchorWCnt,anchorWType,anchorWDay)))endif 0#anchor.solarDatesList thenanchor.solarFlg trueanchor.monthFlg trueendreturn anchorendend--12.1/2/3/4解码锚定在农历每月指定周序上的事件--[lunar][M][2w]2dolocal anchorWCnt,anchorWType,anchorWDay string.match(anchor.desc,%[[Ll]unar%]%[[Mm]%]%[(-*[0-9])([Ww])%]([0-9])$)if nil~anchorWCnt and nil~anchorWType and nil~anchorWDay thenanchorWCnt tonumber(anchorWCnt)if 0anchorWCnt thenanchorWCnt nilendanchorWDay tonumber(anchorWDay)if anchorWDay0 or anchorWDay6 thenanchorWDay nilendendif nil~anchorWCnt and nil~anchorWType and nil~anchorWDay thenlocal lunarDateBase lunar.solar2LunarByTime(os.time())local fakeLunarDate local fakeSolarDate local idx--处理前12个月以及后12个月的事件--第一步处理去年的月份事件for idxlunarDateBase.month,12 doif idx 10 thenfakeSolarDate lunarDatesList[(lunarDateBase.year-1)..0..idx..01.0]elsefakeSolarDate lunarDatesList[(lunarDateBase.year-1)..idx..01.0]endif nil ~ fakeSolarDate thentable.insert(anchor.solarDatesList,os.date(%Y%m%d,timeOfWeekDayBaseOnTime0(dateStr2Time(fakeSolarDate),anchorWCnt,anchorWType,anchorWDay)))endend--第二步处理今年的月份事件for idx1,12 doif idx 10 thenfakeSolarDate lunarDatesList[lunarDateBase.year..0..idx..01.0]elsefakeSolarDate lunarDatesList[lunarDateBase.year..idx..01.0]endif nil ~ fakeSolarDate thentable.insert(anchor.solarDatesList,os.date(%Y%m%d,timeOfWeekDayBaseOnTime0(dateStr2Time(fakeSolarDate),anchorWCnt,anchorWType,anchorWDay)))endend--第三步处理明年的月份事件for idx1,lunarDateBase.month doif idx 10 thenfakeSolarDate lunarDatesList[(lunarDateBase.year1)..0..idx..01.0]elsefakeSolarDate lunarDatesList[(lunarDateBase.year1)..idx..01.0]endif nil ~ fakeSolarDate thentable.insert(anchor.solarDatesList,os.date(%Y%m%d,timeOfWeekDayBaseOnTime0(dateStr2Time(fakeSolarDate),anchorWCnt,anchorWType,anchorWDay)))endendif 0#anchor.solarDatesList thenanchor.lunarFlg trueanchor.monthFlg trueendreturn anchorendend--13.1解码锚定在农历指定月指定天数上的事件--[lunar][Y][M05]4dolocal anchorMonth,anchorDayOffset string.match(anchor.desc,%[[Ll]unar%]%[[Yy]%]%[[Mm]([0-9])%](-*[0-9])$)if nil~anchorMonth and nil~anchorDayOffset thenanchorMonth tonumber(anchorMonth)if anchorMonth1 or anchorMonth12 thenanchorMonth nilendanchorDayOffset tonumber(anchorDayOffset)if 0anchorDayOffset thenanchorDayOffset nilendendif nil~anchorMonth and nil~anchorDayOffset thenlocal lunarDateBase lunar.solar2LunarByTime(os.time())local fakeSolarDate --第一步处理去年的事件if anchorMonth 10 thenfakeSolarDate lunarDatesList[(lunarDateBase.year-1)..0..anchorMonth..01.0]elsefakeSolarDate lunarDatesList[(lunarDateBase.year-1)..anchorMonth..01.0]endif nil ~ fakeSolarDate thenfakeSolarDate os.date(*t,dateStr2Time(fakeSolarDate))fakeSolarDate.day fakeSolarDate.day anchorDayOffset - (anchorDayOffset0 and 1 or 0)table.insert(anchor.solarDatesList,os.date(%Y%m%d,os.time(fakeSolarDate)))end--第二步处理今年的事件if anchorMonth 10 thenfakeSolarDate lunarDatesList[lunarDateBase.year..0..anchorMonth..01.0]elsefakeSolarDate lunarDatesList[lunarDateBase.year..anchorMonth..01.0]endif nil ~ fakeSolarDate thenfakeSolarDate os.date(*t,dateStr2Time(fakeSolarDate))fakeSolarDate.day fakeSolarDate.day anchorDayOffset - (anchorDayOffset0 and 1 or 0)table.insert(anchor.solarDatesList,os.date(%Y%m%d,os.time(fakeSolarDate)))end--第三步处理明年的事件if anchorMonth 10 thenfakeSolarDate lunarDatesList[(lunarDateBase.year1)..0..anchorMonth..01.0]elsefakeSolarDate lunarDatesList[(lunarDateBase.year1)..anchorMonth..01.0]endif nil ~ fakeSolarDate thenfakeSolarDate os.date(*t,dateStr2Time(fakeSolarDate))fakeSolarDate.day fakeSolarDate.day anchorDayOffset - (anchorDayOffset0 and 1 or 0)table.insert(anchor.solarDatesList,os.date(%Y%m%d,os.time(fakeSolarDate)))endif 0#anchor.solarDatesList thenanchor.lunarFlg trueanchor.yearFlg trueendreturn anchorendend--14.1解码锚定在公历指定月指定天数上的事件--[solar][Y][M05]4dolocal anchorMonth,anchorDayOffset string.match(anchor.desc,%[[Ss]olar%]%[[Yy]%]%[[Mm]([0-9])%](-*[0-9])$)if nil~anchorMonth and nil~anchorDayOffset thenanchorMonth tonumber(anchorMonth)if anchorMonth1 or anchorMonth12 thenanchorMonth nilendanchorDayOffset tonumber(anchorDayOffset)if 0anchorDayOffset thenanchorDayOffset nilendendif nil~anchorMonth and nil~anchorDayOffset thenlocal solarDateBase os.date(*t)local fakeSolarDate--第一步处理去年的事件fakeSolarDate os.date(*t,os.time({yearsolarDateBase.year,monthanchorMonth,day1}))fakeSolarDate.year fakeSolarDate.year - 1fakeSolarDate.day fakeSolarDate.day anchorDayOffset - (anchorDayOffset0 and 1 or 0)table.insert(anchor.solarDatesList,os.date(%Y%m%d,os.time(fakeSolarDate)))--第二步处理今年的事件fakeSolarDate os.date(*t,os.time({yearsolarDateBase.year,monthanchorMonth,day1}))fakeSolarDate.day fakeSolarDate.day anchorDayOffset - (anchorDayOffset0 and 1 or 0)table.insert(anchor.solarDatesList,os.date(%Y%m%d,os.time(fakeSolarDate)))--第三步处理明年的事件fakeSolarDate os.date(*t,os.time({yearsolarDateBase.year,monthanchorMonth,day1}))fakeSolarDate.year fakeSolarDate.year 1fakeSolarDate.day fakeSolarDate.day anchorDayOffset - (anchorDayOffset0 and 1 or 0)table.insert(anchor.solarDatesList,os.date(%Y%m%d,os.time(fakeSolarDate)))if 0#anchor.solarDatesList thenanchor.solarFlg trueanchor.yearFlg trueendreturn anchorendend--15.1/2解码锚定在指定节气指定天数上的事件--[lunar][Y][JQ春分]4dolocal anchorJqName,anchorDayOffset string.match(anchor.desc,%[[Ll]unar%]%[[Yy]%]%[[Jj][Qq](.)%](-*[0-9])$)if nil~anchorJqName and nil~anchorDayOffset thenif 0lunar.jqIdxByName(anchorJqName) thenanchorJqName nilendanchorDayOffset tonumber(anchorDayOffset)if 0anchorDayOffset thenanchorDayOffset nilendendif nil~anchorJqName and nil~anchorDayOffset thenlocal jqInfo lunar.jqInfoByName(anchorJqName)if #jqInfo.jqTimeList0 thenlocal idxlocal tfor idx 1,#jqInfo.jqTimeList do--以每一个节气的时间为指定的基准时间t jqInfo.jqTimeList[idx]t t (anchorDayOffset - (anchorDayOffset0 and 1 or 0))*86400table.insert(anchor.solarDatesList,os.date(%Y%m%d,t))endendif 0#anchor.solarDatesList thenanchor.lunarFlg trueanchor.yearFlg trueanchor.jqFlg trueendreturn anchorendendreturn anchor end--将文档处理成行数组 local function files_to_lines(...)if dbgFlg thenprint(---files_to_lines called here)endlocal tabsetmetatable({},{__indextable})local index1for i,filename in next,{...} dolocal fn io.open(filename)if fn thenfor line in fn:lines() doif not line or #line 0 thentab:insert(line)endendfn:close()endendif dbgFlg thenprint(---files_to_lines completed here)endreturn tab end--根据加载的文档创建事件字典以公历日期为索引 local function eventsDicBySolarDatesBuild(...)if dbgFlg thenprint(--eventsDicBySolarDatesBuild called here)endlocal linesfiles_to_lines(...)for i,line in next ,lines doif dbgFlg thenprint(line is: , line)endif not line:match(^%s*#) then -- 第一字 # 为注释行local d,kW,c string.match(line,(.)\t(%C*)\t(%C*))if nil ~ d thenlocal thisEvent {}thisEvent.d dthisEvent.kW kW or thisEvent.c c or thisEvent.kWif ~ thisEvent.kW thenthisEvent.kWs stringSplit(thisEvent.kW, )endif nil thisEvent.kWs thenthisEvent.kWs {thisEvent.kW}endlocal anchorInfo anchorDecode(thisEvent.d)local thisKw for idx 1,#anchorInfo.solarDatesList dolocal subEvent {}subEvent.c1 thisEvent.dsubEvent.c2 thisEvent.kWsubEvent.c3 thisEvent.csubEvent.kWs thisEvent.kWslocal thisSolarDate anchorInfo.solarDatesList[idx]subEvent.time dateStr2Time(thisSolarDate)subEvent.solarDate thisSolarDatelocal tDiff dt.timeDiff(subEvent.time)if tDiff.monthsDiff-1 then--如果这个事件的时间点已经过去大于一个月了则不做处理if dbgFlg thenprint(这个事件放弃,subEvent.c1,thisSolarDate)endelse--添加一个新的事件if nil eventsDicBySolarDates[thisSolarDate] theneventsDicBySolarDates[thisSolarDate] {subEvent}elsetable.insert(eventsDicBySolarDates[thisSolarDate],subEvent)endfor subIdx 1, #subEvent.kWs dothisKw subEvent.kWs[subIdx] or if ~thisKw thenif nil eventsDicListByKeyW[thisKw] then--这是一个新的 kWeventsDicListByKeyW[thisKw] {subEvent}else--这不是一个新的 kWtable.insert(eventsDicListByKeyW[thisKw],subEvent)endendendendendendendendif dbgFlg thenprint(--eventsDicBySolarDatesBuild completed here)end end--通过keyWord来获取对应的事件列表 local function getEventsByKw(kW)local eventsList {}kW kW or if kW thenreturn eventsListendif nileventsDicListByKeyW theneventsList {}elseeventsList eventsDicListByKeyW[kW] or {}end--需要进行一个排序处理以方便后端使用if #eventsList 0 then--做一个排序按time升序排列table.sort(eventsList,function(a,b)if a.time b.time thenreturn trueendreturn falseend)endreturn eventsList end--通过时间来获取对应的事件列表 local function getEventsByTime(t)local eventsList {}if nil t thent os.time()endif nileventsDicBySolarDates theneventsList {}elseeventsList eventsDicBySolarDates[os.date(%Y%m%d,t)]endreturn eventsList or {} end--test local function test(printPrefix)if nil printPrefix thenprintPrefix endif dbgFlg thenprint(eventsListModule test starting...)end--sysInfoRes.test(printPrefix.. )--lunar.test(printPrefix.. )--dt.test(printPrefix.. )for k,v in pairs(eventsDicBySolarDates) doif dbgFlg thenprint(printPrefix..k..\t..v)endend endfunction M.init(...)--准备日期序列包括去年一整年以及将来一整年的日期在内local daysCntThisYear tonumber(os.date(%j))lunarDatesListBuild(370daysCntThisYear,740-daysCntThisYear)--创建节气表lunar.jqListBuild()--加载文档中的事件信息local files{...}--文件名不支持中文其中 # 开始的行为注释行table.insert(files,eventsList.txt)for i,v in next, files dofiles[i] sysInfoRes.currentDir()../.. vendeventsDicBySolarDatesBuild(table.unpack(files))--抛出功能函数M.getEventsByKw getEventsByKwM.getEventsByTime getEventsByTimeM.setDbg setDbgM.test test endM.init()return M日期与时间 为了实现增强版的日期时间输入效果我们需要整理出来日期与农历事件二十四节气之间的对应关系同时为了实现时间的快捷输入我们需要整理出不同格式的时间信息。为此我们需要 dateTimeModule.lua 脚本文档以实现此功能。 dateTimeModule.lua 脚本内容如下 --dateTimeModule.lua --Copyright (C) 2023 yaoyuan.dou douyaoyuan126.com --该模块主要提供一些当前的时间和日期的相关信息 local M{} local dbgFlg false--引入农历计算模块 local lunarEnable, lunar pcall(require, lunarModule)-- 导入log模块记录日志 local logEnable, log pcall(require, runLog)--设置 dbg 开关 local function setDbg(flg)flg flg or dbgFlgdbgFlg flgif lunarEnable thenlunar.setDbg(flg)endif logEnable thenlog.setDbg(flg)endprint(dateTimeModule dbgFlg is ..tostring(dbgFlg)) endlocal wNames_CN {星期日,星期一,星期二,星期三,星期四,星期五,星期六} local wNames_EN {Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday} local wNames_Short {Sun.,Mon.,Tues.,Wed.,Thur.,Fri.,Sat.} local mName_EN {January,February,March,April,May,June,July,August,September,October,November,December} local mName_Short {Jan.,Feb.,Mar.,Apr.,May.,Jun.,Jul.,Aug.,Sep.,Oct.,Nov.,Dec.} local numSymbals {st,nd,rd,th} local timeLogos {[0000],[0030],[0100],[0130],[0200],[0230],[0300],[0330],[0400],[0430],[0500],[0530],[0600],[0630],[0700],[0730],[0800],[0830],[0900],[0930],[1000],[1030],[1100],[1130],[1200],[1230],[1300],[1330],[1400],[1430],[1500],[1530],[1600],[1630],[1700],[1730],[1800],[1830],[1900],[1930],[2000],[2030],[2100],[2130],[2200],[2230],[2300],[2330],[2400]} local diZhi {子,丑,寅,卯,辰,巳,午, 未,申,酉,戌,亥}local function numSymbal(num)if num 4 thenreturn numSymbals[4]elsereturn numSymbals[num]end end--获取timeLogo local function timeLogo(t)t t or os.time()local timeNow os.time()if type(t) type(timeNow) thentimeNow tendlocal hourValue os.date(%H,timeNow)local minValuetonumber(os.date(%M,timeNow))if 15 minValue and minValue 45 thenreturn timeLogos[string.format(%02d30,hourValue)]elseif 15 minValue thenreturn timeLogos[string.format(%02d00,hourValue)]elsereturn timeLogos[string.format(%02d00,hourValue1)]end end--[[提供一个timeInfo的时间结构定义如下 timeInfo.time: 以秒为单位的时间戳 timeInfo.shiChen时辰 timeInfo.time122:47:12 timeInfo.time222:47 timeInfo.time322点47分16秒 timeInfo.timeLogo: 时间对应的钟表符号 ]] local function timeInfoByTime(t)t t or os.time()local tBaseos.time()if type(t)type(tBase) thentBase tendlocal timeInfo {}timeInfo.time tBasetimeInfo.shiChen timeInfo.time1 os.date(%H:%M:%S,tBase)timeInfo.time2 os.date(%H:%M,tBase)timeInfo.time3 os.date(%H点%M分%S秒,tBase)local h tonumber(os.date(%H,tBase))h math.floor((h 1)/2)1timeInfo.shiChen (diZhi[h] or diZhi[1])..时timeInfo.timeLogo timeLogo(tBase)return timeInfo end--[[根据指定的时间返回结构化的 alltimeInfo 对象结构如下 alltimeInfo.time: 时间值 alltimeInfo.YYYYMMDD_hhmmss: 2022-05-09 22:47:12 alltimeInfo.YYYYMMDD_hhmm: 2022-05-09 22:47 alltimeInfo.YYYYMMDD_W_hhmmss: 2022年5月9日 星期一 22点47分16秒 alltimeInfo.W_M_Date_hhmmss_YYYY: Mon. May. 09th, 22:47:01, 2022 alltimeInfo.timeLogo: 时间对应的时钟符号 ]] local function alltimeInfo(t)t t or os.time()local tBase os.time()if type(t) type(tBase) thentBase tendlocal alltimeInfo {}alltimeInfo.time tBase--处理星期信息, os.date(%w): 距离周日的天数local wNtonumber(os.date(%w,tBase)) 1local wInfo{wNames_CN[wN],wNames_EN[wN],wNames_Short[wN]}--处理月份信息local mNtonumber(os.date(%m,tBase))local mInfo{mName_EN[mN],mName_Short[mN]}--处理日期信息local dNtonumber(os.date(%d,tBase))local dInfo{os.date(%d)..numSymbal(dN)}--处理时分信息local timeInfo timeInfoByTime(tBase)--合成alltime信息--2022-05-09 22:47:12alltimeInfo.YYYYMMDD_hhmmssos.date(%Y-%m-%d).. ..timeInfo.time1--2022-05-09 22:47alltimeInfo.YYYYMMDD_hhmmos.date(%Y-%m-%d).. ..timeInfo.time2--2022年5月9日 星期一 22点47分16秒alltimeInfo.YYYYMMDD_W_hhmmss os.date(%Y年)..tonumber(os.date(%m))..月..tonumber(os.date(%d))..日 ..wInfo[1].. ..timeInfo.time3--Mon. May. 09th, 22:47:01, 2022alltimeInfo.W_M_Date_hhmmss_YYYY wInfo[3].. ..mInfo[2].. ..dInfo[1].. ..timeInfo.time1.., ..os.date(%Y)alltimeInfo.timeLogo timeInfo.timeLogo--返回alltime信息return alltimeInfo end--提供 alltList 信息 local function allt()--处理星期信息, os.date(%w): 距离周日的天数local wNtonumber(os.date(%w)) 1local wInfo{wNames_CN[wN],wNames_EN[wN],wNames_Short[wN]}--处理月份信息local mNtonumber(os.date(%m))local mInfo{mName_EN[mN],mName_Short[mN]}--处理日期信息local dNtonumber(os.date(%d))local dInfo{os.date(%d)..numSymbal(dN)}--处理时分信息local timeInfo timeInfoByTime()--合成alltime信息--2022-05-09 22:47:12local allt_1 os.date(%Y-%m-%d).. ..timeInfo.time1--2022-05-09 22:47local allt_2 os.date(%Y-%m-%d).. ..timeInfo.time2--2022年5月9日 星期一 22点47分16秒local allt_3 os.date(%Y年)..tonumber(os.date(%m))..月..tonumber(os.date(%d))..日 ..wInfo[1].. ..timeInfo.time3--Mon. May. 09th, 22:47:01, 2022local allt_4 wInfo[3].. ..mInfo[2].. ..dInfo[1].. ..timeInfo.time1.., ..os.date(%Y)--返回alltime信息return {allt_1,allt_2,allt_3,allt_4} end--[[根据时间返回日期信息一个日期信息结构如下 dateInfo.time日期的时间值 dateInfo.YYYY日期的年份值 dateInfo.MM日期的年份值 dateInfo.DD日期的年份值 dateInfo.date_YYYYMMDD_12022/05/09 dateInfo.date_MMDD_105/09 dateInfo.date_YYYYMMDD_22022-05-09 dateInfo.date_MMDD_205-09 dateInfo.date_YYYY_MM_DD_12022年05月09日 dateInfo.date_YYYY_M_D_12022年5月9日 dateInfo.date_M_D_15月9日 dateInfo.date_M_Dth_YYYYMar. 09th, 2022 dateInfo.date_M_Dth_YYYY_2May 09th, 2022 dateInfo.date10二〇二二年五月九日 dateInfo.date_yyMxx23M04 dateInfo.date_YYYYMMDD20230412 dateInfo.lunarInfo: 一个lunar的结构体 ]] local function dateInfoByTime(t)t t or os.time()local baseTime os.time()if type(t) type(baseTime) thenbaseTime tend--处理年份信息local yNtonumber(os.date(%Y,baseTime))local yN_1yN_1os.date(%Y,baseTime):gsub(%d,{[1]一,[2]二,[3]三,[4]四,[5]五,[6]六,[7]七,[8]八,[9]九,[0]〇,})local yInfo{yN_1..年}--处理月份信息local mNtonumber(os.date(%m,baseTime))local mN_1mN_1os.date(%m,baseTime):gsub(%d,{[1]一,[2]二,[3]三,[4]四,[5]五,[6]六,[7]七,[8]八,[9]九,[0],})if mN 10 thenmN_1 十elseif mN 11 thenmN_1 十一elseif mN 12 thenmN_1 十二endlocal mInfo{mName_EN[mN],mName_Short[mN],mN_1..月}--处理日期信息local dNtonumber(os.date(%d,baseTime))local dN_1dN_1os.date(%d,baseTime):gsub(%d,{[1]一,[2]二,[3]三,[4]四,[5]五,[6]六,[7]七,[8]八,[9]九,[0],})if dN 19 thendN_1 string.sub(dN_1,1,3)..十..string.sub(dN_1,4,#dN_1)elseif dN 9 thendN_1十..string.sub(dN_1,4,#dN_1)enddN_1 dN_1..日local dInfo{os.date(%d,baseTime)..numSymbal(dN),dN_1}local dateInfo {}dateInfo.time baseTimedateInfo.YYYY os.date(%Y,baseTime)dateInfo.MM os.date(%m,baseTime)dateInfo.DD os.date(%d,baseTime)--合成 dateInfo 信息--2022/05/09dateInfo.date_YYYYMMDD_1 os.date(%Y/%m/%d,baseTime)--05/09dateInfo.date_MMDD_1 os.date(%m/%d,baseTime)--2022-05-09dateInfo.date_YYYYMMDD_2 os.date(%Y-%m-%d,baseTime)--05-09dateInfo.date_MMDD_2 os.date(%m-%d,baseTime)--2022年05月09日dateInfo.date_YYYY_MM_DD_1 os.date(%Y年%m月%d日,baseTime)--2022年5月9日dateInfo.date_YYYY_M_D_1 os.date(%Y年,baseTime)..tonumber(os.date(%m,baseTime))..月..tonumber(os.date(%d,baseTime))..日--5月9日dateInfo.date_M_D_1 tonumber(os.date(%m,baseTime))..月..tonumber(os.date(%d,baseTime))..日--May. 09th, 2022dateInfo.date_M_Dth_YYYY_1 mInfo[2].. ..dInfo[1].., ..os.date(%Y,baseTime)--May 09th, 2022dateInfo.date_M_Dth_YYYY_2 mInfo[1].. ..dInfo[1].., ..os.date(%Y,baseTime)--二〇二二年五月九日dateInfo.date10 yInfo[1]..mInfo[3]..dInfo[2]--23M04dateInfo.date_yyMxx os.date(%yM%m,baseTime)--20230412dateInfo.date_YYYYMMDD os.date(%Y%m%d,baseTime)dateInfo.lunarInfo lunar.solar2LunarByTime(baseTime)--输出 dateInfo 信息return dateInfo end--提供 date信息 local function dateInfoByDaysOffset(daysOffset)--baseDate准备daysOffset daysOffset or 0local thisOffset 0if type(thisOffset) type(daysOffset) thenthisOffset daysOffsetendlocal baseTime os.date(*t)baseTime.day baseTime.day thisOffsetlocal info dateInfoByTime(os.time(baseTime))--输出 dateInfo 信息return info end--提供指定时间的 wInfo 信息 --[[week结构如下 wInfo.time时间戳 wInfo.nameCN周名称中文 wInfo.nameEN周名称英文 wInfo.nameShort周名称简写 wInfo.xxWxx周序23W29 wInfo.offset2Sun距离周日的天数 wInfo.offset2Year年内周数同步于xxWxx ]] local function wInfoByTime(t)t t or os.time()local timeBase os.time()if type(t) type(timeBase) thentimeBase tend--处理星期信息, os.date(%w): 距离周日的天数local wNtonumber(os.date(%w,timeBase))--计算今年以来的周数local weekNoos.date(%W,timeBase) 1local wInfo {}wInfo.time timeBasewInfo.nameCN wNames_CN[wN1]wInfo.nameEN wNames_EN[wN1]wInfo.nameShort wNames_Short[wN1]wInfo.offset2Sun wNwInfo.offset2Year weekNowInfo.xxWxx os.date(%y,timeBase)..W..wInfo.offset2Yearreturn wInfo end--提供指定时间的 week 信息 local function week(t)local thisInfo wInfoByTime(t)return {thisInfo.nameCN,thisInfo.nameEN,thisInfo.nameShort,thisInfo.xxWxx} end--[[计算两个时间之间的差别以 t1 为参考点返回结构体如下 diff.tRef这是计算的基准时间 diff.tTgt这是计算的目标时间 diff.timeDiff这是时间戳差单位是s diff.daysDiff这是天数差单位是天 diff.monthsDiff这是月数差单位是月 diff.yearsDiff这是年数差单位是年 diff.weeksDiff这是周数差单位是周 ]] local function timeDiff(t1,t2)local diff {}if nil t1 thent1 os.time()endif nil t2 then--如果只有一个参数则计算所给的 t1与当前时间的差值t2 t1t1 os.time()enddiff.tRef t1diff.tTgt t2diff.timeDiff 0diff.daysDiff 0diff.monthsDiff 0diff.yearsDiff 0diff.weeksDiff 0local t11 os.date(*t, t1)local t22 os.date(*t, t2)--计算时间差diff.timeDiff t2 - t1--计算天数差local t11_noTime os.time({yeart11.year, montht11.month, dayt11.day})local t22_noTime os.time({yeart22.year, montht22.month, dayt22.day})diff.daysDiff math.floor((t22_noTime - t11_noTime) / (3600 * 24))--计算年数差diff.yearsDiff t22.year - t11.year--计算月数差diff.monthsDiff diff.yearsDiff * 12 t22.month - t11.month--计算周数差local t1_wn tonumber(os.date(%w,t1))local t2_wn tonumber(os.date(%w,t2))local daysDiffToWeekStart diff.daysDiff t1_wn - t2_wndiff.weeksDiff math.floor(daysDiffToWeekStart/7)return diff end--计算时间偏差的语义以 t1 为base计算 t2 的偏离量 local function daysDiffName(t1,t2)local tDiff timeDiff(t1,t2)local comment if tDiff.daysDiff -3 thencomment 大前天elseif tDiff.daysDiff -2 thencomment 前天elseif tDiff.daysDiff 0 thencomment 今天elseif tDiff.daysDiff -1 thencomment 昨天elseif tDiff.daysDiff 1 thencomment 明天elseif tDiff.daysDiff 2 thencomment 后天elseif tDiff.daysDiff 3 thencomment 大后天elseif tDiff.weeksDiff -2 thencomment 上上周elseif tDiff.weeksDiff -1 thencomment 上周elseif tDiff.weeksDiff 1 thencomment 下周elseif tDiff.weeksDiff 2 thencomment 下下周elseif tDiff.monthsDiff -2 thencomment 上上月elseif tDiff.monthsDiff -1 thencomment 上月elseif tDiff.monthsDiff 1 thencomment 下月elseif tDiff.monthsDiff 2 thencomment 下下月elseif tDiff.yearsDiff -3 thencomment 大前年elseif tDiff.yearsDiff -2 thencomment 前年elseif tDiff.yearsDiff -1 thencomment 去年elseif tDiff.yearsDiff 1 thencomment 明年elseif tDiff.yearsDiff 2 thencomment 后年elseif tDiff.yearsDiff 3 thencomment 大后年elseif tDiff.yearsDiff ~ 0 thencomment math.abs(tDiff.yearsDiff)..年..((tDiff.yearsDiff0) and 前 or 后)elseif tDiff.monthsDiff ~ 0 thencomment math.abs(tDiff.monthsDiff)..个月..((tDiff.monthsDiff0) and 前 or 后)elseif tDiff.weeksDiff ~ 0 thencomment math.abs(tDiff.weeksDiff)..周..((tDiff.weeksDiff0) and 前 or 后)elseif tDiff.daysDiff ~ 0 thencomment math.abs(tDiff.daysDiff)..天..((tDiff.daysDiff0) and 前 or 后)endreturn comment end--这是测试函数 local function test()local alltList allt()local idxprint(allt)for idx1,#alltList doprint(\t..alltList[idx])endlocal lunarList,jqList,dateList lunar.jqListComming()print(lunarInfo)for idx1,#lunarList doprint(\t..lunarList[idx]..\t..jqList[idx]..\t..dateList[idx])endlocal wInfo week()print(week info)for idx1,#wInfo doprint(\t..wInfo[idx])end end--模块化封装 function M.init(...)print(- M.init called here)--抛出功能函数M.jqListComming lunar.jqListCommingM.jqIdxByName lunar.jqIdxByNameM.jqInfoByTime lunar.jqInfoByTimeM.jqListBuild lunar.jqListBuildM.timeInfoByTime timeInfoByTimeM.alltimeInfo alltimeInfoM.allt alltM.dateInfoByTime dateInfoByTimeM.dateInfoByDaysOffset dateInfoByDaysOffsetM.week weekM.wInfoByTime wInfoByTimeM.timeLogo timeLogoM.timeDiff timeDiffM.daysDiffName daysDiffNameM.setDbg setDbgM.test test endM.init()return M以上脚本中我们整合了包括二十四节气农历事件日期时间在内的所有与日期时间概念挂钩的信息同时为了在事件提示时更人性化可阅读我们实现了语义日期函数。 dateTime_filter.lua dateTime_filter.lua 脚本将以上所有的日期时间信息进行了整合以适配rime引擎滤镜调用。dateTime_filter.lua 脚本内容如下 --dateTime_filter.lua --Copyright (C) 2023 yaoyuan.dou douyaoyuan126.com --本脚本主要用于提供一些与时间日期信息相关的处理服务--引入支持模块处理日期和时间信息 local ok, res pcall(require, dateTimeModule) local alltimeInfo res.alltimeInfo local jqListComming res.jqListComming local jqIdxByName res.jqIdxByName local jqInfoByTime res.jqInfoByTime local wInfoByTime res.wInfoByTime local daysDiffName res.daysDiffName local dateInfoByTime res.dateInfoByTime local dateInfoByDaysOffset res.dateInfoByDaysOffset local timeInfoByTime res.timeInfoByTime-- 导入log模块记录日志 local logEnable, log pcall(require, runLog)--创建节气表 res.jqListBuild()--引入 eventsList 模块处理日期相关事件信息 local ok, res1 pcall(require, eventsListModule) local getEventsByKw res1.getEventsByKw local getEventsByTime res1.getEventsByTime--最长的comment长度限制 local maxLenOfComment 250--加载农历信息 local lunarList,jqList,timeList local thisLunar,thisJq,thisTime local cands local theCands local candTxt_lower local thisComment local alltInfo local dateInfoList local jqTime local jqName local eventsList local thisEvent local thisTxt local wInfo local timeBase local timeReBase local dateInfolocal function Filter(input, env)--获取dateTimeInfo开关状态local on true --env.engine.context:get_option(dateTime)cands{}for cand in input:iter() do--抛出原选项if nil cands[cand.text] thenyield(cand)cands[cand.text]trueendif on thencandTxt_lower cand.text:lower()--时间选项整理if ({[time]true,[时间]true,[现在]true,[now]true,[此刻]true,[此时]true})[candTxt_lower] then--处理时间信息alltInfo alltimeInfo()theCands{}if ({[现在]true,[now]true,[此刻]true,[此时]true})[candTxt_lower] thentable.insert(theCands,{candTxt_lower..(..alltInfo.YYYYMMDD_hhmmss..),alltInfo.timeLogo})endtable.insert(theCands,{alltInfo.YYYYMMDD_hhmmss,alltInfo.timeLogo})table.insert(theCands,{alltInfo.YYYYMMDD_hhmm,alltInfo.timeLogo})table.insert(theCands,{alltInfo.YYYYMMDD_W_hhmmss,alltInfo.timeLogo})table.insert(theCands,{alltInfo.W_M_Date_hhmmss_YYYY,alltInfo.timeLogo})--抛出选项for idx 1, #theCands dothisTxt theCands[idx][1]thisComment theCands[idx][2]if nil cands[thisTxt] thenyield(Candidate(word, cand.start, cand._end, thisTxt, thisComment))cands[thisTxt] trueendendelseif ({[时辰]true})[candTxt_lower] thenlocal timeInfo timeInfoByTime()theCands{}table.insert(theCands,{timeInfo.shiChen,timeInfo.timeLogo})for idx 1, #theCands dothisTxt theCands[idx][1]thisComment theCands[idx][2]if nil cands[thisTxt] thenyield(Candidate(word, cand.start, cand._end, thisTxt, thisComment))cands[thisTxt] trueendendelseif ({[钟表]true,[时钟]true,[clock]true,[表]true})[candTxt_lower] thenlocal timeInfo timeInfoByTime()theCands{}table.insert(theCands,{timeInfo.timeLogo,})--抛出选项for idx 1, #theCands dothisTxt theCands[idx][1]thisComment theCands[idx][2]if nil cands[thisTxt] thenyield(Candidate(word, cand.start, cand._end, thisTxt, thisComment))cands[thisTxt] trueendendelseif ({[date]true,[日期]true,[今天]true,[今日]true,[today]true,[明天]true,[明日]true,[后天]true,[昨天]true,[前天]true})[candTxt_lower] then--处理日期信息if ({[date]true,[日期]true,[今天]true,[今日]true,[today]true})[candTxt_lower] thendateInfo dateInfoByDaysOffset(0)elseif ({[明天]true,[明日]true})[candTxt_lower] thendateInfo dateInfoByDaysOffset(1)elseif ({[后天]true})[candTxt_lower] thendateInfo dateInfoByDaysOffset(2)elseif ({[昨天]true})[candTxt_lower] thendateInfo dateInfoByDaysOffset(-1)elseif ({[前天]true})[candTxt_lower] thendateInfo dateInfoByDaysOffset(-2)end--获取周序信息wInfo wInfoByTime(dateInfo.time)--获取今天的事件信息eventsList getEventsByTime(dateInfo.time)--获取今天的24节气信息jqTime, jqName jqInfoByTime(dateInfo.time)--如果今天有特殊事件则合成事件的comment信息local eventsStr for idx 1, #eventsList dothisEvent eventsList[idx]if ~ eventsStr theneventsStr eventsStr..\r[]..thisEvent.c3elseeventsStr []..thisEvent.c3endendtheCands {}if ({[今天]true,[今日]true,[today]true,[明天]true,[明日]true,[后天]true,[昨天]true,[前天]true})[candTxt_lower] thenif ~eventsStr thentable.insert(theCands,{candTxt_lower..(..dateInfo.date_YYYYMMDD..),eventsStr})elsetable.insert(theCands,{candTxt_lower..(..dateInfo.date_YYYYMMDD..),})endtable.insert(theCands,{dateInfo.date_YYYYMMDD_1.. ..wInfo.nameCN,})elseif ~eventsStr thentable.insert(theCands,{dateInfo.date_YYYYMMDD_1.. ..wInfo.nameCN,eventsStr})elsetable.insert(theCands,{dateInfo.date_YYYYMMDD_1.. ..wInfo.nameCN,})endendtable.insert(theCands,{dateInfo.date_M_Dth_YYYY_1,})table.insert(theCands,{dateInfo.date_YYYYMMDD,})if jqTime0 thentable.insert(theCands,{dateInfo.lunarInfo.lunarDate_1,dateInfo.lunarInfo.jiJieLogo..jqName})elsetable.insert(theCands,{dateInfo.lunarInfo.lunarDate_4,dateInfo.lunarInfo.jiJieLogo})end--抛出选项for idx 1, #theCands dothisTxt theCands[idx][1]thisComment theCands[idx][2]if nil cands[thisTxt] thenyield(Candidate(word, cand.start, cand._end, thisTxt, thisComment))cands[thisTxt] trueendendelseif ({[周日]true,[周一]true,[周二]true,[周三]true,[周四]true,[周五]true,[周六]true})[candTxt_lower] then--获取今天的周信息timeBase os.date(*t)wInfo wInfoByTime()local wOffsetInput ({[周日]0,[周一]1,[周二]2,[周三]3,[周四]4,[周五]5,[周六]6})[candTxt_lower]--调整 basetimeBase.day timeBase.day wOffsetInput - wInfo.offset2SunwInfo wInfoByTime(os.time(timeBase))jqTime, jqName jqInfoByTime(os.time(timeBase))dateInfo dateInfoByDaysOffset(wOffsetInput-tonumber(os.date(%w)))local daysDiff daysDiffName(os.time(),os.time(timeBase))eventsList getEventsByTime(os.time(timeBase))local eventsStr for idx 1, #eventsList dothisEvent eventsList[idx]if ~ eventsStr theneventsStr eventsStr..\r[]..thisEvent.c3elseeventsStr []..thisEvent.c3endendlocal commentStr if 今天daysDiff thencommentStr []elseif ~daysDiff thenif os.time() os.time(timeBase) thencommentStr [..daysDiff..]elsecommentStr [..daysDiff..]endendif ~jqName thenif commentStr thencommentStr jqNameelsecommentStr commentStr..\r..jqNameendendif ~eventsStr thenif commentStr thencommentStr eventsStrelsecommentStr commentStr..\r..eventsStrendenddateInfoList {dateInfo.date_YYYYMMDD_1,dateInfo.date_YYYYMMDD_2,dateInfo.date_M_Dth_YYYY_1,dateInfo.date_YYYYMMDD}for idx 1, #dateInfoList dothisTxt dateInfoList[idx]if nil cands[thisTxt] thenif 1idx and ~commentStr thenyield(Candidate(word, cand.start, cand._end, thisTxt, commentStr))elseyield(Candidate(word, cand.start, cand._end, thisTxt, ))endcands[thisTxt]trueendendelseif ({[lunar]true,[农历]true,[节气]true})[candTxt_lower] then--处理农历信息lunarList,jqList,timeList jqListComming()theCands{}for idx 1, math.min(6,#lunarList) dothisJq jqList[idx]thisTime timeList[idx]dateInfo dateInfoByTime(thisTime)thisLunar dateInfo.lunarInfo.lunarDate_4if os.date(%Y/%m/%d,thisTime) os.date(%Y/%m/%d) thenthisJq /..dateInfo.lunarInfo.jiJieLogo..thisJqelselocal daysDiff daysDiffName(os.time(),thisTime)if ~ daysDiff thenif os.time() thisTime thendaysDiff [..daysDiff..]elsedaysDiff [..daysDiff..]endendthisLunar dateInfo.lunarInfo.lunarDate_4..(..thisJq..)thisJq dateInfo.lunarInfo.jiJieLogo..dateInfo.date_YYYYMMDD..daysDiffendtable.insert(theCands,{thisLunar,thisJq})end--抛出选项for idx 1, #theCands dothisTxt theCands[idx][1]thisComment theCands[idx][2]if nil cands[thisTxt] thenyield(Candidate(word, cand.start, cand._end, thisTxt, thisComment))cands[thisTxt] trueendendelseif ({[wx]true,[周序]true,[周数]true})[candTxt_lower] then--处理周信息wInfo wInfoByTime()theCands{}table.insert(theCands,{wInfo.xxWxx,})--抛出周序选项for idx 1, #theCands dothisTxt theCands[idx][1]thisComment theCands[idx][2]if nil cands[thisTxt] thenyield(Candidate(word, cand.start, cand._end, thisTxt, thisComment))cands[thisTxt] trueendendelseif ({[本周]true,[这周]true,[上周]true,[下周]true})[candTxt_lower] then--处理周信息timeBase os.date(*t)--对齐到周一timeBase.day timeBase.day - os.date(%w) 1if ({[上周]true})[candTxt_lower] thentimeBase.day timeBase.day - 7elseif ({[下周]true})[candTxt_lower] thentimeBase.day timeBase.day 7endwInfo wInfoByTime(os.time(timeBase))theCands{}if ({[本周]true,[上周]true,[下周]true})[candTxt_lower] thentable.insert(theCands,{candTxt_lower..(..wInfo.xxWxx..),})endtable.insert(theCands,{wInfo.xxWxx,})for idx0,6 dotimeReBase os.date(*t,os.time(timeBase))timeReBase.day timeReBase.day idxlocal daysDiff daysDiffName(os.time(),os.time(timeReBase))--获取事件eventsList getEventsByTime(os.time(timeReBase))--节取节气local jqT,jqN jqInfoByTime(os.time(timeReBase))--日期信息dateInfo dateInfoByTime(os.time(timeReBase))--周序信息wInfo wInfoByTime(os.time(timeReBase))--如果存在节气或者存在事件if ~jqN or 0#eventsList thenthisComment local daysDiffInfo os.date(%Y/%m/%d,os.time(timeReBase))if os.date(%Y/%m/%d) os.date(%Y/%m/%d,os.time(timeReBase)) thendaysDiffInfo []elseif ~daysDiff and candTxt_lower~daysDiff then--为了避免关键字与日期差异的信息冗余增加条件 candTxt_lower~daysDiffif os.time() os.time(timeReBase) thendaysDiffInfo [..daysDiff..]elsedaysDiffInfo [..daysDiff..]endend--如果节气存在if jqT0 thenif thisComment thenif ~daysDiffInfo thenthisComment dateInfo.lunarInfo.jiJieLogo..jqN..daysDiffInfodaysDiffInfo elsethisComment dateInfo.lunarInfo.jiJieLogo..jqNendelseif ~daysDiffInfo thenthisComment thisComment..\r..dateInfo.lunarInfo.jiJieLogo..jqN..daysDiffInfodaysDiffInfo elsethisComment thisComment..\r..dateInfo.lunarInfo.jiJieLogo..jqNendendend--如果事件存在for idx 1,#eventsList dothisEvent eventsList[idx]if ~thisEvent.c3 and ~thisEvent.cycleType thenif ~daysDiffInfo thenif thisComment thenthisComment []..thisEvent.c3..daysDiffInfoelsethisComment thisComment..\r[]..thisEvent.c3..daysDiffInfoenddaysDiffInfo elseif thisComment thenthisComment []..thisEvent.c3elsethisComment thisComment..\r[]..thisEvent.c3endendendendif thisComment thenthisComment endtable.insert(theCands,{dateInfo.date_YYYYMMDD_1.. ..wInfo.nameCN,thisComment})endend--抛出选项for idx 1, #theCands dothisTxt theCands[idx][1]thisComment theCands[idx][2]if nil cands[thisTxt] thenyield(Candidate(word, cand.start, cand._end, thisTxt, thisComment))cands[thisTxt] trueendendelseif ({[week]true,[星期]true})[candTxt_lower] then--处理周信息wInfo wInfoByTime()theCands{}table.insert(theCands,{wInfo.nameCN,})table.insert(theCands,{wInfo.nameEN,})table.insert(theCands,{wInfo.nameShort,})--抛出选项for idx 1, #theCands dothisTxt theCands[idx][1]thisComment theCands[idx][2]if nil cands[thisTxt] thenyield(Candidate(word, cand.start, cand._end, thisTxt, thisComment))cands[thisTxt] trueendendelseif ({[本月]true,[上月]true,[下月]true})[candTxt_lower] then--处理月份信息if ({[本月]true})[candTxt_lower] thendateInfo dateInfoByTime(os.time())elseif ({[上月]true})[candTxt_lower] thendateInfo dateInfoByDaysOffset(-os.date(%d)-1)elseif ({[下月]true})[candTxt_lower] thendateInfo dateInfoByDaysOffset(45-os.date(%d))endtheCands{}if ({[本月]true,[上月]true,[下月]true})[candTxt_lower] thentable.insert(theCands,{candTxt_lower..(..dateInfo.date_yyMxx..),})endtable.insert(theCands,{dateInfo.date_yyMxx,})--抛出选项for idx 1, #theCands dothisTxt theCands[idx][1]thisComment theCands[idx][2]if nil cands[thisTxt] thenyield(Candidate(word, cand.start, cand._end, thisTxt, thisComment))cands[thisTxt] trueendendelseif ({[今年]true,[去年]true,[明年]true,[前年]true,[后年]true})[candTxt_lower] thenif ({[今年]true})[candTxt_lower] thendateInfo dateInfoByTime(os.time({year tonumber(os.date(%Y)), month 5, day 1, hour 8, min 0, sec 0}))elseif ({[去年]true})[candTxt_lower] thendateInfo dateInfoByTime(os.time({year tonumber(os.date(%Y))-1, month 5, day 1, hour 8, min 0, sec 0}))elseif ({[明年]true})[candTxt_lower] thendateInfo dateInfoByTime(os.time({year tonumber(os.date(%Y))1, month 5, day 1, hour 8, min 0, sec 0}))elseif ({[前年]true})[candTxt_lower] thendateInfo dateInfoByTime(os.time({year tonumber(os.date(%Y))-2, month 5, day 1, hour 8, min 0, sec 0}))elseif ({[后年]true})[candTxt_lower] thendateInfo dateInfoByTime(os.time({year tonumber(os.date(%Y))2, month 5, day 1, hour 8, min 0, sec 0}))endtheCands{}table.insert(theCands,{candTxt_lower..(..dateInfo.YYYY..),})table.insert(theCands,{dateInfo.lunarInfo.year_shengXiao..年,})table.insert(theCands,{dateInfo.lunarInfo.year_ganZhi..年,})table.insert(theCands,{dateInfo.lunarInfo.year_ganZhi..(..dateInfo.lunarInfo.year_shengXiao..)..年,})--抛出选项for idx 1, #theCands dothisTxt theCands[idx][1]thisComment theCands[idx][2]if nil cands[thisTxt] thenyield(Candidate(word, cand.start, cand._end, thisTxt, thisComment))cands[thisTxt] trueendendelseif jqIdxByName(candTxt_lower)0 then--查找指定的节气信息lunarList,jqList,timeList jqListComming()local matchFlg falselocal jqCnt 0theCands{}for idx 1, #jqList dothisLunar lunarList[idx]thisJq jqList[idx]thisTime timeList[idx]wInfo wInfoByTime(thisTime)dateInfo dateInfoByTime(thisTime)if not matchFlg thenmatchFlg (thisJq candTxt_lower) or falseendif matchFlg thenlocal daysDiff daysDiffName(os.time(),thisTime)if 今天 daysDiff thenthisJq ..thisJqelseif ~ daysDiff thenif os.time() thisTime thendaysDiff [..daysDiff..]elsedaysDiff [..daysDiff..]endendthisLunar thisLunar..(..thisJq..)thisJq dateInfo.lunarInfo.jiJieLogo..os.date(%Y/%m/%d,thisTime)..daysDiffend--加入周信息thisLunar thisLunar.. ..wInfo.nameCNif nil cands[thisLunar] thentable.insert(theCands,{thisLunar,thisJq})jqCnt jqCnt 1endif jqCnt 4 thenbreakendendend--抛出选项for idx 1, #theCands dothisTxt theCands[idx][1]thisComment theCands[idx][2]if nil cands[thisTxt] thenyield(Candidate(word, cand.start, cand._end, thisTxt, thisComment))cands[thisTxt] trueendendenddo--事件选项整理local eventsList getEventsByKw(candTxt_lower)if 0#eventsList thenlocal timeNow os.date(*t)--校准到零点timeNow os.time({yeartimeNow.year,monthtimeNow.month,daytimeNow.day,hour0})for idx1,#eventsList dolocal thisE eventsList[idx]if thisE.time timeNow thendateInfo dateInfoByTime(thisE.time)wInfo wInfoByTime(thisE.time)local tDiff daysDiffName(thisE.time) or local thisComment thisE.c3local thisCandTxt dateInfo.date_YYYYMMDD_1.. ..wInfo.nameCNif nilcands[thisCandTxt] and ~ thisComment thenif tDiff thenthisComment []..thisCommentelseif os.time() thisE.time thenthisComment [..tDiff..]..thisCommentelsethisComment [..tDiff..]..thisCommentendendyield(Candidate(word, cand.start, cand._end, thisCandTxt, thisComment))cands[thisCandTxt]trueendendendendendendend endreturn Filter 注意 截止目前以上所述的txt文档或者lua文档均应该在用户文件夹下的lua文件夹内如下 rime.lua 一如继往我们需要在 rime.lua 脚本中将 dateTime_filter 方法转换成 rime引擎滤镜以便我们在输入方案中配置使用该滤镜。rime.lua脚本内容如下 help_translator require(help) inputShow_translator require(inputShow) inputShow_Filter require(inputShow_Filter) Upper_Filter require(Upper_Filter) dic_4w_Filter require(dic_4w_Filter) phraseReplace_Filter require(phraseReplace_Filter) pinyinAdding_Filter require(pinyinAdding_Filter) dateTime_Filter require(dateTime_filter)以上脚本中注意最后一行我们在下游的输入方案中配置lua滤镜时所引用的名称是 号左边的 dateTime_Filter 名称而不是 dateTime_filter注意大小写。 wubi_pinyin.custom.yaml 截止目前我们已经完成了dateTime_Filter滤镜的定义。此处以五笔・拼音输入方案为例展示如何配置使用 dateTime_Filter 滤镜。 我们在 五笔・拼音 输入方案的方案文档 wubi_pinyin.schema.yaml 的补丁文档 wubi_pinyin.schema.yaml 中增加以下滤镜配置 # encoding:utf-8 patch:engine/filters: # 设置以下filter- simplifier- lua_filterdateTime_Filter # 时间信息对于特定的时间或者事件关键字添加时间信息例如日期今天明天肝炎父亲等# 上面的滤镜会减少或者改变候先词选项- uniquifier # 过滤重复候选项依赖 simplifier上面的配置并不是wubi_pinyin.custom.yaml中的所有配置此处仅展示了与 dateTime_Filter 滤镜配置有关的部分。 效果欣赏 至此我们已经完成了所有的dateTime_Filter滤镜的功能配置保存你的配置并重新部署你的rime你应该可以在输入日期时显示如下的效果 而且这无关你使用什么输入法五笔拼音双拼都一样。 配置文档 本文所涉配置文档共 9 个其中文档 runLog.lua 与滤镜功能无关文中没有专项介绍这些文档你可以在 rime中州韵小狼毫须鼠管 dateTime滤镜 日期时间滤镜 配置.zip 下载取用。 如果你可以访问gitHub你也可以在 dyyRime 中找到完全版本的配置包。 小结 本文分享了一种在rime中州韵小狼毫须鼠管输入法中使用的dateTime滤镜。该滤镜可以实现增强的日期和时间输入效果。同时该滤镜可以支持二十四节气农历事件的映射提示和输入。大大扩展了rime中州韵小狼毫须鼠管输入法的功能性和实用性。
http://www.hkea.cn/news/14266437/

相关文章:

  • 深圳微信网站制作网页画图工具
  • 怎么搭建个人网站电脑做服务器设计在线看
  • 昆明建设厅网站百度账号快速注册
  • asp企业网站模版google提交网站入口
  • 翻译做网站wordpress文字大小
  • asp科技公司网站源码做网站怎么设置背景
  • 临县网站建设管理咨询网站
  • 网站开发技术岗位职责视频制作模板
  • 注册网站流程手机字体下载大全免费网站
  • 设计师自己的网站营销手段和营销方式
  • 做网站第三方网站页面设计培训班
  • 查询类网站用什么做清华大学有关网站建设的书
  • 网站正在备案网站建设价格规范
  • 沈阳做微网站黄冈网站建设哪家快些
  • 自己买服务器建设网站上海室内设计工作室排名
  • 网站开发怎么挣外快百度收录要多久
  • 学校网站建设的风险分析wap仿制网站教程
  • 深圳php网站建设自己 做 网站
  • 动易网站迁移制作天下网站
  • 制作公司网站的步骤赶集网网站建设ppt模板
  • 电商推广绩效站内优化
  • 网站 被黑重庆商家网站
  • 网站建设介绍专门做自助游的网站
  • 做网站可以设账户吗网站模板超市
  • 响应式网站模板 食品工业设计产品设计公司排名
  • 做直播网站软件有哪些叶县网站建设
  • 布吉网站建设哪家公司便宜点网站后期的维护
  • 平顶山做网站哪家好百度云登陆首页
  • 云主机怎样做网站株洲做网站那家好
  • 谢馥春网站建设的优势海曙网站制作