如何将ESP32通过configTime获取的时间存入变量?
解决ESP32获取格式化时间并存储到变量的问题
问题原因
你遇到的问题是因为C++的逗号运算符特性:表达式(&timeinfo, "%Y%m%d %H:%M:%S")会先计算第一个子表达式(&timeinfo),然后返回第二个子表达式的结果(也就是格式化模板字符串"%Y%m%d %H:%M:%S"),所以dateL最终存储的是模板而非格式化后的时间。
而Serial.println(&timeinfo, "%Y%m%d %H:%M:%S")能正常工作,是因为ESP32的Arduino库为Serial类实现了专门的重载函数,它内部会帮你完成时间格式化的逻辑,但普通字符串变量没有这个内置支持。
解决方案:使用标准C函数strftime
格式化struct tm到字符串变量的标准方法是用C标准库的strftime函数,它可以把时间结构体按照指定格式转换成字符串。
方法1:使用字符数组存储
适合对内存占用敏感的场景:
// 定义足够大的字符数组("YYYYMMDD HH:MM:SS"共17个字符,留余量设为20) char dateL[20]; // 格式化时间到字符数组 strftime(dateL, sizeof(dateL), "%Y%m%d %H:%M:%S", &timeinfo);
方法2:使用Arduino String类存储
更灵活,适合需要字符串操作的场景:
String dateL; char tempBuffer[20]; // 先格式化到临时字符数组 strftime(tempBuffer, sizeof(tempBuffer), "%Y%m%d %H:%M:%S", &timeinfo); // 转存到String对象 dateL = tempBuffer;
完整代码示例
#include <WiFi.h> // 替换成你的WiFi信息 const char* ssid = "YourWiFiSSID"; const char* password = "YourWiFiPassword"; void setup() { Serial.begin(115200); // 连接WiFi WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println("\nWiFi Connected"); // 配置NTP时间(东八区,根据你的时区调整偏移量) configTime(8 * 3600, 0, "pool.ntp.org", "time.nist.gov"); struct tm timeinfo; // 等待NTP同步成功,获取有效时间 while (!getLocalTime(&timeinfo)) { Serial.println("Failed to get time, retrying..."); delay(1000); } // 字符数组方式存储 char dateL_char[20]; strftime(dateL_char, sizeof(dateL_char), "%Y%m%d %H:%M:%S", &timeinfo); Serial.print("Formatted Time (char array): "); Serial.println(dateL_char); // String类方式存储 String dateL_string; char temp[20]; strftime(temp, sizeof(temp), "%Y%m%d %H:%M:%S", &timeinfo); dateL_string = temp; Serial.print("Formatted Time (String): "); Serial.println(dateL_string); } void loop() { // 这里添加你的传感器采集和云端上传逻辑 delay(5000); }
注意事项
- 确保
getLocalTime(&timeinfo)返回true(即成功获取到时间),否则timeinfo无效,格式化结果会出错。 - 字符数组的大小要足够容纳格式化后的字符串,避免缓冲区溢出(比如
"%Y%m%d %H:%M:%S"的长度是17,所以数组大小至少设为18,留1位给结束符\0)。
内容的提问来源于stack exchange,提问作者RobT
相关产品推荐
相关产品推荐

