![](/img/trans.png)
[英]How do I convert "2016-Dec-31 23:59:60" UTC time with c++20 chrono to local time and print correct leap seconds?
[英]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 以將其與實際時間進行比較。
但出於測試目的,我使用echo -n "Fri Feb 28 14:44:11 2020" >/dev/udp/192.168.43.248/4210
從我的 MacBook Pro (MacOS Mojave) 通過 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,我意識到我試圖將月 + 日字符放入 int 中(我可以通過將字符轉換為 int 來解決這個問題)。
但是我聽了@Maxim Egorushkin 並使用了使用 time_t 值的更簡單的方法:
char *buffer;
time_t i = strtoul(incomingPacket, &buffer, 10);
如果您有選擇,我建議您改為傳遞ISO-8601 時間戳。 那看起來像
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
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.