从char转换为time_t始终返回1969年12月31日星期三

时间:2020-03-03 10:13:30

标签: c++ c arduino arduino-esp8266 time-t

我正在为Arduino中的ESP8266开发一些代码。我想通过UDP将时间戳发送到另一个ESP。

setup(){中,我使用

初始化时间。
configTime(3 * 3600, 0, "pool.ntp.org", "time.nist.gov"); 

loop(){

time_t timestamp = time(nullptr);

获取时间。然后,我将其发送到另一个ESP

Udp.write(ctime(&timestamp));

我需要再次设置time_t并将其与实际时间进行比较。

但是出于测试目的,我使用MacBook Pro(MacOS Mojave)中的echo -n "Fri Feb 28 14:44:11 2020" >/dev/udp/192.168.43.248/4210通过UDP终端以char形式发送时间。

串行监视器显示输入和输出如下:

UDP packet contents: Fri Feb 28 14:44:11 2020
Wed Dec 31 23:59:59 1969

我的代码是:

time_t convertStringToTime_t(char timestamp []) {
  time_t result = time(NULL);
  const char *timestampString = timestamp;
  int weekDay, month, dd, hh, mm, ss, yyyy = 0;
  struct tm timestampFromString = {0};

  //input     Fri Feb 28 16:40:11 2020
  //output    Wed Dec 31 23:59:59 1969 TODO always same output?!

  sscanf(timestampString, "%s %s %d %d:%d:%d %d", &weekDay, &month, &dd, &hh, &mm, &ss, &yyyy);

  timestampFromString.tm_year = yyyy - 1900; //years since 1900
  timestampFromString.tm_mon = month - 1;
  timestampFromString.tm_wday = weekDay;
  timestampFromString.tm_mday = dd;
  timestampFromString.tm_hour = hh;
  timestampFromString.tm_min = mm;
  timestampFromString.tm_sec = ss;
  timestampFromString.tm_isdst = -1;

  result = mktime(&timestampFromString);
  // mktime   Convert tm structure to time_t
  return result;
}

我看到了this thread,但对我没有任何帮助:/ 我也尝试使用sscanf,但没有区别。我认为我在scanf中做错了吗?

已解决: 多亏了@thomachan,我才意识到我试图将Month + Day字符放入int(我可以通过将chars转换为int来解决这个问题)。

但是我听了@Maxim Egorushkin,并使用了更简单的方法,使用了time_t值:

char *buffer;
time_t i = strtoul(incomingPacket, &buffer, 10);

2 个答案:

答案 0 :(得分:1)

如果您有选择,建议您改为通过a ISO-8601 timestamp。看起来像

2020-03-03T10:28:59

并用sscanf(为您提供组件)或strptime(填充struct tm)进行了简单分析。如果您的平台不提供strptime实施,则可以使用BSD中的一种。

答案 1 :(得分:1)

如果您不需要人类可读的时间,则可以发送time_t的值-自Unix时代以来的秒数。

date +%s > /dev/udp/192.168.43.248/4210

接收方可以使用std::strtoul将其从字符串解析为time_t