前言
今天利用esp8266获取网络时间,发现点灯科技的时区设置函数 Blinker.setTimezone(),在设置时区时,有一点问题。
一、 Blinker.setTimezone()是什么?
这个函数是点灯科技中为了获取各个时区NTP时间,设置的一个时区设置函数。作用就是获取不同时区的时间。
比如,设置时区, 如: 北京时间为+8:00,Blinker.setTimezone(8.0);(点灯科技开发文档)
二、使用过程的问题
1.使用的Blinker库版本
使用的Blinker库版本为0.3.8
代码如下(示例):
void setup() {
// 初始化串口
//WiFi.mode(WIFI_AP_STA); //设置工作模式 -- set work mode: WIFI_AP /WIFI_STA /WIFI_AP_STA
Serial.begin(115200);
// 初始化串口,用于调试输出信息
Blinker.setTimezone(-8.0);
OLED_Init();
OLED_ColorTurn(0);//0正常显示 1反色显示
OLED_DisplayTurn(0);//0正常显示 1翻转180度显示
#if defined(BLINKER_PRINT)
BLINKER_DEBUG.stream(BLINKER_PRINT);
#endif
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, HIGH);
// 初始化blinker
Blinker.begin(auth, ssid, pswd);
Button1.attach(button1_callback);
// Button2.attach(button2_callback);
Blinker.attachData(dataRead);
//注册一个心跳包
Blinker.attachHeartbeat(heartbeat);
Blinker.attachDataStorage(dataStorage);
dht.begin();
}
Blinker.setTimezone(-8.0);-8.0代表西八区时区,
Blinker.setTimezone(8.0);8.0代表东八区时区,即北京时间。
获取具体时间的代码
//获取时间
int16_t year1 = Blinker.year();
int8_t month1 = Blinker.month();
int8_t day1 = Blinker.mday();
int16_t yday1 = Blinker.yday();
int8_t wday1 = Blinker.wday();
int8_t hour1 = Blinker.hour();
int8_t min1 = Blinker.minute();
int8_t sec1 = Blinker.second();
Serial.println(year1);
Serial.println(month1);
Serial.println(day1);
switch (wday1) {
case 0:
time1 = "Sunday";
break;
case 1:
time1 = "Monday";
break;
case 2:
time1 = "Tuesday";
break;
case 3:
time1 = "Wednesday";
break;
case 4:
time1 = "Thursday";
break;
case 5:
time1 = "Friday";
break;
case 6:
time1 = "Saturday";
break;
};
String year2 = (String)year1;
String month2 = (String)month1;
String day2 = (String)(day1);
String yday2 = (String)(yday1);
String hour2 = (String)(hour1);
String min2 = (String)(min1);
String sec2 = (String)(sec1);
str = year2 + "-" + month2 + "-" + day2;
String str_time = hour2 + ":" + min2 + ":" + sec2;
const char* str1 = str.c_str();
const char* str_time1 = str_time.c_str();
const char* time2 = time1.c_str();
Blinker.setTimezone(-8.0);实验结果图片
2.实验结果反馈
部分代码如下(示例):
void setup() {
Serial.begin(115200);
// 初始化串口,用于调试输出信息
Blinker.setTimezone(-8.0);
}
void loop() {
Blinker.run();
//获取时间
int16_t year1 = Blinker.year();
int8_t month1 = Blinker.month();
int8_t day1 = Blinker.mday();
int16_t yday1 = Blinker.yday();
int8_t wday1 = Blinker.wday();
int8_t hour1 = Blinker.hour();
int8_t min1 = Blinker.minute();
int8_t sec1 = Blinker.second();
Serial.println(year1);
Serial.println(month1);
Serial.println(day1);
switch (wday1) {
case 0:
time1 = "Sunday";
break;
case 1:
time1 = "Monday";
break;
case 2:
time1 = "Tuesday";
break;
case 3:
time1 = "Wednesday";
break;
case 4:
time1 = "Thursday";
break;
case 5:
time1 = "Friday";
break;
case 6:
time1 = "Saturday";
break;
};
String year2 = (String)year1;
String month2 = (String)month1;
String day2 = (String)(day1);
String yday2 = (String)(yday1);
String hour2 = (String)(hour1);
String min2 = (String)(min1);
String sec2 = (String)(sec1);
str = year2 + "-" + month2 + "-" + day2;
String str_time = hour2 + ":" + min2 + ":" + sec2;
const char* str1 = str.c_str();
const char* str_time1 = str_time.c_str();
const char* time2 = time1.c_str();
OLED_DrawBMP(0, 0, 128, 64, BMP4); //显示图片
Blinker.delay(1000); //延时1秒
OLED_Clear();//清除界面
//显示524湿度数据
int h1 = (int)h;
int h2 = (int)(h*10-h1*10);
OLED_ShowString(48, 0, "524", 16);
OLED_ShowString(0, 3, "shidu:", 16);
OLED_ShowNum(50, 3, h1, 2, 16);
OLED_ShowString(66, 3, ".", 16);
OLED_ShowNum(74, 3, h2, 1, 16);
OLED_ShowString(82, 3, "%", 16);
OLED_ShowString(15, 6, str1, 16);
Blinker.delay(2000); //延时1秒 delay函数的单位为ms
OLED_Clear();
//显示524温度数据
int m = (int)t;
int n = (int)(t * 100 - m * 100);
OLED_ShowString(48, 0, "524", 16);
OLED_ShowString(0, 3, "wendu:", 16);
OLED_ShowNum(63, 3, m, 2, 16);
OLED_ShowString(79, 3, ".", 16);
OLED_ShowNum(87, 3, n, 2, 16);
OLED_ShowString(15, 6, str1, 16);
Blinker.delay(2000); //延时1秒 delay函数的单位为ms
OLED_Clear();
//显示时间
OLED_ShowString(15, 0, time2, 16);
OLED_ShowString(15, 3, str1, 16);
OLED_ShowString(15, 6, str_time1, 16);
Blinker.delay(1000);
}
修改时区为-8.0后,时分秒的数据恢复为东八区的时分秒,但是在年月日上却发现显示的日期为昨天的日期;将时区修改为8.0后,年月日的时间没有问题,但是时分秒的时间就变化为西八区时间。请问这是怎么回事?
总结
求教 Blinker.setTimezone函数的参数,为什么参数和时区对应不上?
现在自己解决的方式是对获取的mday [int8_t mday = Blinker.mday()]参数进行加一操作。
各位大佬,有更好的解决方式,请不惜赐教,在下感激不尽。