You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ESP32无法从NTP同步时间,输出1969年时区错误时间

ESP32 NTP同步失败输出1969年时间的排查与修复

问题本质

你看到的1969年时间,是因为系统时间未完成NTP同步,time(NULL)返回Unix纪元起始值0,经PST时区(UTC-8)偏移后显示为1969-12-31 16:00。结合esp_netif_sntp_sync_wait()超时的现象,核心问题是SNTP服务在网络未就绪时就启动了,导致无法连接NTP服务器。

代码中的关键错误

你的代码在WiFi连接建立前就初始化了SNTP服务——SNTP依赖网络通信,提前启动会直接同步失败,且默认配置下不会自动重试。

修复方案

1. 调整SNTP初始化时机

将SNTP服务的初始化代码移到WiFi连接成功的分支中,确保网络可用后再启动:

if (wifiEventBits & WIFI_CONNECTED_BIT) {
    ESP_LOGI(STA, "Successfully connected to AP SSID: %s", EXAMPLE_ESP_WIFI_SSID);
    
    // 网络就绪后启动SNTP
    char ntp_server_address[] = "pool.ntp.org";
    esp_sntp_config_t sntp_configs = ESP_NETIF_SNTP_DEFAULT_CONFIG(ntp_server_address);
    // 开启周期性同步,避免单次失败后不再尝试
    sntp_configs.sync_mode = SNTP_SYNC_MODE_CONTINUOUS;
    ESP_ERROR_CHECK(esp_netif_sntp_init(&sntp_configs));
    ESP_LOGI(NTP, "SNTP service started from %s", ntp_server_address);

    // 设置PST时区
    char timezone[] = "PST8PDT";
    setenv("TZ", timezone, 1);
    tzset();
    ESP_LOGI(NTP, "Timezone set to %s", timezone);
}

2. 清理冗余代码

删除wifi_init_sta()中原先的SNTP初始化和时区设置代码,避免无效的提前初始化操作。

3. 优化时间打印逻辑(可选)

在打印时间前增加同步状态判断,避免输出无效时间:

while(1) {
    time_t secondsSinceEpoch = time(NULL);
    // 以2001年为分界,判断时间是否已同步
    if (secondsSinceEpoch < 1000000000) {
        ESP_LOGW(NTP, "Time not synchronized yet");
    } else {
        struct tm* localTime = localtime(&secondsSinceEpoch);
        ESP_LOGI(NTP, "Current time is:  %s", asctime(localTime));
    }
    xDelayUntilSuccess = xTaskDelayUntil(&xPrevWakeTime, pdMS_TO_TICKS(*xPeriodMS));
}

额外排查建议

  • 检查路由器是否拦截UDP 123端口(NTP默认通信端口)的出站流量
  • 尝试更换NTP服务器,比如time.apple.com或ntp.aliyun.com
  • 在SNTP启动后调用esp_netif_sntp_sync_wait(pdMS_TO_TICKS(30000))等待30秒,同步失败时会返回错误码,便于定位问题

内容的提问来源于stack exchange,提问作者pnamunn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 13:17:05