在程序中加入农历节气信息

nanyi 5月前 629

在工作过程中,刚好需要获取农历和节气的相关信息,找了下资料,大概可以通过一些网站api获取,或者有成熟的js来计算,再调用计算结果,考虑软件实际使用场景,并经过“游戏”同学的完善提升,代码参考如下。

代码说明:1)原考虑时间信息直接通过time库time(time.now(),"%H:%M:%S")来输出,但发现在软件运行过程中,如果调用chrome浏览器等比较占内存的操作,会导致整个界面卡住,影响观感,遂采用只显示时分加呼吸跳动形式。

2)为方便数据显示和调用,故采用json格式输出。

3)js库采用lunar.js,当然这个js库很强大,这里只用到了很少的几个函数,具体见:https://6tail.cn/calendar/api.html

4)演示字体采用华为鸿蒙字体,可自行下载安装  https://developer.huawei.com/consumer/cn/design/resource/

5)具体文件详见附件!

import win.ui;
/*DSG{{*/
var mainForm = win.form(text="aardio form";right=933;bottom=561;bgcolor=12861702;maximize=1)
mainForm.add(
staDate={cls="static";text="2024/05/28";left=11;top=416;right=149;bottom=450;align="right";center=1;color=15397364;db=1;dl=1;font=LOGFONT(h=-20;name='HarmonyOS Sans SC';weight=700);transparent=1;z=2};
staLunar={cls="static";text="-";left=758;top=469;right=880;bottom=503;center=1;color=15397364;db=1;dr=1;font=LOGFONT(h=-18;name='HarmonyOS Sans SC';weight=700);transparent=1;z=3};
staSolarTerms={cls="static";text="-";left=758;top=497;right=912;bottom=531;center=1;color=15397364;db=1;dr=1;font=LOGFONT(h=-18;name='HarmonyOS Sans SC';weight=700);transparent=1;z=4};
staTimeDot={cls="static";text=":";left=113;top=448;right=151;bottom=515;align="center";center=1;color=15397364;db=1;dl=1;font=LOGFONT(h=-64;name='HarmonyOS Sans SC';weight=700);transparent=1;z=6};
staTimeHour={cls="static";text="15";left=20;top=447;right=127;bottom=531;align="center";center=1;color=15397364;db=1;dl=1;font=LOGFONT(h=-64;name='HarmonyOS Sans SC';weight=700);transparent=1;z=1};
staTimeMin={cls="static";text="15";left=136;top=447;right=243;bottom=531;align="center";center=1;color=15397364;db=1;dl=1;font=LOGFONT(h=-64;name='HarmonyOS Sans SC';weight=700);transparent=1;z=7};
staWeek={cls="static";text="星期二";left=173;top=417;right=242;bottom=451;center=1;color=15397364;db=1;dl=1;font=LOGFONT(h=-20;name='HarmonyOS Sans SC';weight=700);transparent=1;z=5}
)
/*}}*/

var today=tostring(time(time.now(),"%Y/%m/%d"))
var timeHour=tostring(time(time.now(),"%H"))
var timeMin=tostring(time(time.now(),"%M"))

var week={
    ["0"]="星期天";
    ["1"]="星期一";
    ["2"]="星期二";
    ["3"]="星期三";
    ["4"]="星期四";
    ["5"]="星期五";
    ["6"]="星期六";
}

//设置农历、节气相关 lunarDate:农历年月日  currentSolarTerms:当前节气  nextSolarTerms:下一个节气 dateTime:下一个节气时间
setLunar=function(lunarDate,currentSolarTerms,dateTime1,nextSolarTerms,dateTime2){
	//农历年月日
	mainForm.staLunar.text=lunarDate
	
	//节气
	if(currentSolarTerms!=""){
		mainForm.staSolarTerms.text="今日 "++currentSolarTerms//++tostring(time(dateTime1,"%H:%M:%S"))	
	}
	else {
		var nextSolarTermsDiff=math.abs(time.now().diffday(time(dateTime2)))+1
		if(nextSolarTermsDiff<8){
			mainForm.staSolarTerms.text="距 "++nextSolarTerms++" 还有 "++nextSolarTermsDiff++" 天"
		}	
	}
}

import lunar;
var json=web.json.parse(lunar.getLunar());
setLunar(json.lunar.lunarDate,json.solarTerms[1].currentSolarTerms,json.solarTerms[1].dateTime,json.solarTerms[2].nextSolarTerms,json.solarTerms[2].dateTime)

//日期更新
dateUpdate=function(){
	mainForm.staDate.text=time(time.now(),"%Y/%m/%d")
    mainForm.staWeek.text=week[tostring(time().dayofweek)]
    var json=web.json.parse(lunar.getLunar());
	setLunar(json.lunar.lunarDate,json.solarTerms[1].currentSolarTerms,json.solarTerms[1].dateTime,json.solarTerms[2].nextSolarTerms,json.solarTerms[2].dateTime)
}

//初始化
dataInit=function(){
	mainForm.staTimeHour.text =time(time.now(),"%H")
	mainForm.staTimeMin.text =time(time.now(),"%M")
	dateUpdate()
}

dataInit()

tmClock = mainForm.setInterval(
    function(hwnd,msg,id,tick){
       
    	if(mainForm.staTimeDot.hide==1){
        	mainForm.staTimeDot.hide=0
        } 
     	else {
        	mainForm.staTimeDot.hide=1
     	}
    	//时钟更新
    	var timeHourNow=tostring(time(time.now(),"%H"))
    	if(timeHourNow!=timeHour){
    		 mainForm.staTimeHour.text =time(time.now(),"%H")
    		 timeHour=tostring(time(time.now(),"%H"))
    	}
    	//分钟更新
    	var timeMinNow=tostring(time(time.now(),"%M"))
    	if(timeMinNow!=timeMin){
    		 mainForm.staTimeMin.text =time(time.now(),"%M")
    		 timeMin=tostring(time(time.now(),"%M"))
    	}
    	
        //日期更新 
        var todayNow=tostring(time(time.now(),"%Y/%m/%d"))
        if(todayNow!=today){
        	dateUpdate()
        	today=tostring(time(time.now(),"%Y/%m/%d"))
        }
    },1000/*毫秒*/
);

mainForm.show();
win.loopMessage();
return mainForm;

演示截图:



上传的附件:
最新回复 (4)
  • 光庆 5月前
    0 2

  • 小光芒 5月前
    0 3
    赞一个
  • Xmzzz 5月前
    0 4
    感谢分享,赞
  • 光庆 5月前
    0 5
    看了一下,官方函数资料比较详细,就顺手封装了个库,方便使用。
返回
发新帖