字符到 time_t 的转换总是 returns Wed Dec 31 23:59:59 1969
Char to time_t conversion always returns Wed Dec 31 23:59:59 1969
我正在为我在 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(×tamp));
我需要再次制作一个 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(×tampFromString);
// mktime Convert tm structure to time_t
return result;
}
我看到了 但它对我一点帮助都没有:/
我也尝试使用 sscanf
但没有区别。我想我在 scanf
?
中做错了什么
已解决:
感谢@thomachan,我意识到我试图将月+日字符放入整数中(我可以通过将字符转换为整数来解决这个问题)。
但我听取了@Maxim Egorushkin 的意见并使用了更简单的方法,使用了 time_t 值:
char *buffer;
time_t i = strtoul(incomingPacket, &buffer, 10);
如果你有选择,我建议你通过 a ISO-8601 timestamp。看起来像
2020-03-03T10:28:59
并用 sscanf
(给你组件)或 strptime
(填充 struct tm
)简单地解析。如果您的平台不提供 strptime
实现,您可以使用 BSD 中的实现。
如果您不需要人类可读的时间,您可以发送 time_t
的值 - 自 Unix 纪元以来的秒数。
date +%s > /dev/udp/192.168.43.248/4210
接收方可以使用 std::strtoul
.
将其从字符串解析为 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(×tamp));
我需要再次制作一个 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(×tampFromString);
// mktime Convert tm structure to time_t
return result;
}
我看到了 sscanf
但没有区别。我想我在 scanf
?
已解决: 感谢@thomachan,我意识到我试图将月+日字符放入整数中(我可以通过将字符转换为整数来解决这个问题)。
但我听取了@Maxim Egorushkin 的意见并使用了更简单的方法,使用了 time_t 值:
char *buffer;
time_t i = strtoul(incomingPacket, &buffer, 10);
如果你有选择,我建议你通过 a ISO-8601 timestamp。看起来像
2020-03-03T10:28:59
并用 sscanf
(给你组件)或 strptime
(填充 struct tm
)简单地解析。如果您的平台不提供 strptime
实现,您可以使用 BSD 中的实现。
如果您不需要人类可读的时间,您可以发送 time_t
的值 - 自 Unix 纪元以来的秒数。
date +%s > /dev/udp/192.168.43.248/4210
接收方可以使用 std::strtoul
.
time_t