增加非标准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

@@ -1,5 +1,66 @@
#include "fontenum.h"
//时区表
const int Menu_timearea_array[75][2]=//31
{
{-12,0}, //0
{-11,0}, //1
{-10,0}, //2
{-9,1800},//3
{-9,0}, //4
{-8,0}, //5
{-7,0}, //6
{-6,0}, //7
{-5,0}, //8
{-4,1800},//9
{-4,0}, //10
{-3,1800},//11
{-3,0}, //12
{-2,1800},//13
{-2,0}, //14
{-1,0}, //15
//n+3的规律
{ 0,0}, //16
{ 0,1800},//17
{ 0,2700},//18
{ 1,0}, //19
{ 1,1800},//20
{ 1,2700},//21
{ 2,0}, //22
{ 2,1800},//23
{ 2,2700},//24
{ 3,0}, //25
{ 3,1800},//26//伊朗UTC+3:30东3.5区)
{ 3,2700},//27
{ 4,0}, //28
{ 4,1800},//29//阿富汗UTC+4:30东4.5区)
{ 4,2700},//30
{ 5,0}, //31
{ 5,1800},//32//印度 斯里兰卡UTC+5:30东5.5区)
{ 5,2700},//33//尼泊尔UTC+5:45东5.75区)
{ 6,0}, //34
{ 6,1800},//35//缅甸UTC+6:30东6.5区)
{ 6,2700},//36
{ 7,0}, //37
{ 7,1800},//38
{ 7,2700},//39
{ 8,0}, //40
{ 8,1800},//41
{ 8,2700},//42
{ 9,0}, //43
{ 9,1800},//44
{ 9,2700},//45
{10,0}, //46
{10,1800},//47
{10,2700},//48
{11,0}, //49
{11,1800},//50
{11,2700},//51
{12,0}, //52
{12,1800},//53
{12,2700},//54
};
const char *btns_chs[LANG_MAX][3]=
{

View File

@@ -246,7 +246,7 @@ extern const char Menu_List[LANG_MAX][MENU_LIST_MAX][80];
//空调语言内容
extern const char Menu_AirList[LANG_MAX][AIR_MODE_MAX][5][16];
extern const int Menu_timearea_array[75][2];
#endif

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)

View File

@@ -111,11 +111,12 @@ void setup_scr_datesetpage(lv_ui *ui)
//Write codes datesetpage_zoneddlist
ui->datesetpage_zoneddlist = lv_dropdown_create(ui->datesetpage);
lv_dropdown_set_options(ui->datesetpage_zoneddlist, "UTC-12\nUTC-11\nUTC-10\nUTC-09\nUTC-08\nUTC-07\nUTC-06\nUTC-05\nUTC-04\nUTC-03\nUTC-02\nUTC-01\nUTC+00\nUTC+01\nUTC+02\nUTC+03\nUTC+04\nUTC+05\nUTC+06\nUTC+07\nUTC+08\nUTC+09\nUTC+10\nUTC+11\nUTC+12");
lv_dropdown_set_options(ui->datesetpage_zoneddlist, "UTC-12:00\nUTC-11:00\nUTC-10:00\nUTC-09:30\nUTC-09:00\nUTC-08:00\nUTC-07:00\nUTC-06:00\nUTC-05:00\nUTC-04:30\nUTC-04:00\nUTC-03:30\nUTC-03:00\nUTC-02:30\nUTC-02:00\nUTC-01:00\nUTC+00:00\nUTC+00:30\nUTC+00:45\nUTC+01:00\nUTC+01:30\nUTC+01:45\nUTC+02:00\nUTC+02:30\nUTC+02:45\nUTC+03:00\nUTC+03:30\nUTC+03:45\nUTC+04:00\nUTC+04:30\nUTC+04:45\nUTC+05:00\nUTC+05:30\nUTC+05:45\nUTC+06:00\nUTC+06:30\nUTC+06:45\nUTC+07:00\nUTC+07:30\nUTC+07:45\nUTC+08:00\nUTC+08:30\nUTC+08:45\nUTC+09:00\nUTC+09:30\nUTC+09:45\nUTC+10:00\nUTC+10:30\nUTC+10:45\nUTC+11:00\nUTC+11:30\nUTC+11:45\nUTC+12:00\nUTC+12:30\nUTC+12:45");
lv_obj_set_pos(ui->datesetpage_zoneddlist, 39, 113);
lv_obj_set_size(ui->datesetpage_zoneddlist, 403, 35);
//0--UTC-12 ....12---UTC+0...... 关系:+12
lv_dropdown_set_selected(ui->datesetpage_zoneddlist,tz_get()+12);//-12~+12----->0~24
//0--UTC-12 ....12---UTC+0...... UTC++12
lv_dropdown_set_selected(ui->datesetpage_zoneddlist,GET_nvs_Sys_Info_tzzone());
//Write style for datesetpage_zoneddlist, Part: LV_PART_MAIN, State: LV_STATE_DEFAULT.
lv_obj_set_style_text_color(ui->datesetpage_zoneddlist, lv_color_hex(0xffffff), LV_PART_MAIN|LV_STATE_DEFAULT);

View File

@@ -3389,8 +3389,96 @@ void mcu_write_rtctime(unsigned char time[])
//=0是utc+0
//<0是utc-
//>0是utc+
char zone=(char)((Localtime-standardtime)/3600);
printf("zone:%d\r\n", zone);
char zone=(char)((Localtime-standardtime)/3600);//标准时区
int zone_offset=((Localtime-standardtime)%3600);//处理5:30 6:30等等非准标时区
printf("zone:%d;zone_offset:%d\r\n", zone,zone_offset);
if( (zone<=-13) || (zone>=13) )
{
return;
}
//限制在-12~12之间
//判断是不是标准时间
if(zone==-12)
{
SET_nvs_Sys_Info_tzzone(0);
}else if(zone==-11)
{
SET_nvs_Sys_Info_tzzone(1);
} else if(zone==-10)
{
SET_nvs_Sys_Info_tzzone(2);
} else if(zone==-9)
{
if(zone_offset!=0)//zone_offset=1800 -1800 -9:30
{
SET_nvs_Sys_Info_tzzone(3);
}
else
{
SET_nvs_Sys_Info_tzzone(4);
}
} else if(zone==-8)
{
SET_nvs_Sys_Info_tzzone(5);
} else if(zone==-7)
{
SET_nvs_Sys_Info_tzzone(6);
} else if(zone==-6)
{
SET_nvs_Sys_Info_tzzone(7);
} else if(zone==-5)
{
SET_nvs_Sys_Info_tzzone(8);
} else if(zone==-4)
{
if(zone_offset!=0)//zone_offset=1800 -1800 -4:30
{
SET_nvs_Sys_Info_tzzone(9);
}
else
{
SET_nvs_Sys_Info_tzzone(10);
}
} else if(zone==-3)
{
if(zone_offset!=0)//zone_offset=1800 -1800 -3:30
{
SET_nvs_Sys_Info_tzzone(11);
}
else
{
SET_nvs_Sys_Info_tzzone(12);
}
} else if(zone==-2)
{
if(zone_offset!=0)//zone_offset=1800 -1800 -2:30
{
SET_nvs_Sys_Info_tzzone(13);
}
else
{
SET_nvs_Sys_Info_tzzone(14);
}
} else if(zone==-1)
{
SET_nvs_Sys_Info_tzzone(15);
}
else if(zone>=0)
{
if(zone_offset==1800)
{
SET_nvs_Sys_Info_tzzone(zone*3+17);
}
else if(zone_offset==2700)
{
SET_nvs_Sys_Info_tzzone(zone*3+18);
}
else
{
SET_nvs_Sys_Info_tzzone(zone*3+16);
}
}
struct timeval tv;
//tv.tv_sec=(time_t)Localtime;//用本地时间 时区要设置0 相对0时区的时间
@@ -3406,7 +3494,6 @@ void mcu_write_rtctime(unsigned char time[])
my_memcpy((void *)timestamp,(const char *)time,4); //get timestamp
zigbee_timestamp_to_time();
SET_nvs_Sys_Info_tzzone(zone);
nvs_eepom_sysInfo_update();
//更新时区信息