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

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
ISO-8601时间格式是一种广泛使用的日期和时间表示方法,它的格式为yyyy-MM-dd'T'HH:mm:ssZZ。要进行ISO-8601时间格式的转换,可以使用不同编程语言的内置函数或库来实现。 在Python中,可以使用datetime模块来进行ISO-8601时间格式的转换。可以使用datetime.strptime()函数将字符串解析为datetime对象,然后使用datetime.strftime()函数将datetime对象格式化为所需的字符串格式。例如,要将ISO-8601时间格式的字符串转换为本地时区的时间,可以使用以下代码: ```python import datetime iso_datetime = "2021-10-26T14:53:29+08:00" dt = datetime.datetime.strptime(iso_datetime, "%Y-%m-%dT%H:%M:%S%z") local_dt = dt.astimezone(datetime.timezone(datetime.timedelta(hours=8))) local_datetime_str = local_dt.strftime("%Y-%m-%d %H:%M:%S") print(local_datetime_str) ``` 在Java中,可以使用SimpleDateFormat类来进行ISO-8601时间格式的转换。可以使用SimpleDateFormat.parse()方法将字符串解析为Date对象,然后使用SimpleDateFormat.format()方法将Date对象格式化为所需的字符串格式。例如,要将ISO-8601时间格式的字符串转换为本地时区的时间,可以使用以下代码: ```java import java.text.SimpleDateFormat; import java.util.Date; import java.util.TimeZone; public class Main { public static void main(String[] args) throws Exception { String isoDatetime = "2021-10-26T14:53:29+08:00"; SimpleDateFormat isoFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX"); Date date = isoFormat.parse(isoDatetime); SimpleDateFormat localFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); localFormat.setTimeZone(TimeZone.getDefault()); String localDatetimeStr = localFormat.format(date); System.out.println(localDatetimeStr); } } ``` 以上代码中,将ISO-8601时间格式的字符串解析为Date对象后,使用SimpleDateFormat将其格式化为本地时区的时间字符串。 请注意,根据不同的编程语言和库的实现,可能需要进行一些调整和配置,以确保正确的ISO-8601时间格式转换。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [python pandas ISO-8601时间转换为本地时间](https://blog.csdn.net/weixin_43924621/article/details/113920166)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [ISO8601时间格式的转换](https://blog.csdn.net/gdvfs12/article/details/120973705)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值