点灯科技-setTimezone函数求教


前言

今天利用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()]参数进行加一操作。
各位大佬,有更好的解决方式,请不惜赐教,在下感激不尽。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值