【问题标题】:Char to time_t conversion always returns Wed Dec 31 23:59:59 1969Char 到 time_t 的转换总是返回 Wed Dec 31 23:59:59 1969
【发布时间】:2020-06-15 16:40:45
【问题描述】:

我正在为 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 终端以字符形式发送时间。

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

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(我可以通过将字符转换为 int 来解决这个问题)。

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

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

【问题讨论】:

  • 您不能将scanf 字符串 (%s) 转换为 int
  • 你的意思是sscanf而不是普通的scanf,对吧?
  • 不,他们传递的是char[]的地址,而不是。
  • 另一个问题是你在传递int的地址时使用%s格式说明符
  • tm_mon 需要一个介于 0-11 之间的数字,而 tm_wday 需要一个介于 0-6 之间的数字。执行 sscanf 后需要 cnvert

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


【解决方案1】:

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

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

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

【讨论】:

  • 我该怎么做?只发送原始的“time_t”对象? Udp.write(timestamp);?
  • @binarykitten 由于您发送和接收文本,您需要将time_t 转换为带有std::snprintfstd::to_string 的字符串。 date +%s 输出一个字符串,试试看。
  • 感谢它完美运行!更容易和更短! :)
【解决方案2】:

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

2020-03-03T10:28:59

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-16
    • 2011-01-26
    • 2016-05-03
    相关资源
    最近更新 更多