增加非标准utc时区

This commit is contained in:
wen
2025-11-15 20:16:32 +08:00
parent d24873566d
commit dc23296425
7 changed files with 176 additions and 23 deletions

View File

@@ -39,6 +39,7 @@
// #include "cJSON.h"
#include <drivers/rtc.h>
#include "ESP32_Clock.h"
#include "fontenum.h"
extern rt_mutex_t xGuiSemaphore;
@@ -6300,41 +6301,44 @@ void custom_datetime_key_status(char key,lv_event_code_t code)
else
{
//时区
sel_opt_idt=lv_dropdown_get_selected(guider_ui.datesetpage_zoneddlist);//0~24
sel_opt_idt=lv_dropdown_get_selected(guider_ui.datesetpage_zoneddlist);//0开始的
lv_dropdown_get_selected_str(guider_ui.datesetpage_zoneddlist,str,sizeof(str));
LOG_I_LINE("zone:%s---%d",str,sel_opt_idt-12);
tz_set(sel_opt_idt-12);
LOG_I_LINE("zone:%s---%d",str,sel_opt_idt);
LOG_I_LINE("zone:%d,offset:%d",Menu_timearea_array[sel_opt_idt][0],Menu_timearea_array[sel_opt_idt][1]);
tz_set(Menu_timearea_array[sel_opt_idt][0]);
LOG_I_LINE("new read zone:%d",tz_get());
//UTC的起始时间为1970年1月1日 00:00:00协调世界时
//标准时间戳通常指的是UTC 协调世界时 )。时间戳以 1970年1月1日 零时UTC为起点
//标准时间戳:格林威治时间,以 1970.01.01 00:00:00 为起点到现在的总秒数。
//本地时间戳:考虑时区和夏令时的本地时间,即标准时间 ± 时差。一般设备以本地时间为准
//UTC +时区差*3600秒本地时间
//UTC时间 + 时区*3600秒本地时间
//zone=(Localtime-standardtime)/3600
//UTC=本地时间-时区*3600
//now()显示的是 UTC标准时间
//UTC=本地时间-时区*3600
//now()显示的是 本地时间
//设置的时间当本地时间
// LOG_I_LINE("dateToEpoch:%d\r\n", dateToEpoch(2025, 7, 8, 18, 20, 0));//当地时间 1970开始计算的
// LOG_I_LINE("dateToEpoch2:%d\r\n", dateToEpoch(2025, 7, 8, 18, 20, 0)-tz_get()*3600);//utc时间
time_t Localtime=dateToEpoch(year, month, day, hour, minute, 0);//年月日转换为本地时间(1970开始计算的)
LOG_I_LINE("Localtime:%d\r\n", Localtime);
time_t standardtime=Localtime-tz_get()*3600;//本地时间转换为UTC标准时间戳
LOG_I_LINE("Localtime:%d\r\n", Localtime);//本地时间
//印度utc+5:30为例
//转为标准utc标准时间正常应该-->当地时间(秒)-非标准时区的偏移时间(分钟)*60(秒)-时区(小时)*3600(秒);如果不处理偏移时间 则utc标准时间多了个偏移时间
//由于rtt(时区参数是个整数)不支持处理非标准时区,所以将非标准时区的偏移时间传到了utc标准时间去了
//好处now()显示出来就是本地时间 非标准时区的偏移时间不用再次处理了
//time_t standardtime=Localtime-Menu_timearea_array[sel_opt_idt][1]-tz_get()*3600;//考虑非标准时区 在now()显示本地时间的时候要加上非标准时区的偏移时间
time_t standardtime=Localtime-tz_get()*3600;//不考虑非标准时区 在now()显示本地时间的时候不需要加上非标准时区的偏移时间
LOG_I_LINE("standardtime:%d\r\n",standardtime);
//更新时间 更新的是utc时间
struct timeval tv;
tv.tv_sec=(time_t)standardtime;//utc时间
tv.tv_usec=0;
settimeofday(&tv, NULL);//不用重新设置时区
settimeofday(&tv, NULL);//settimeofday()函数设置的是UTC协调世界时时间而不是当地时间
// SET_nvs_Sys_Info_tzzone(zone);
// nvs_eepom_sysInfo_update();
SET_nvs_Sys_Info_tzzone(sel_opt_idt);//保存时区
nvs_eepom_sysInfo_update();
//退出
if(!guider_ui.dateinfopage)