Update: 2020-09-20

ESP8266 NTP Zeitsynchronisation per WLAN mit Automatischer Sommer- und Winterzeit Umstellung.

Esp8266 NTP Lokalzeit mit Abfrage ob die Zeit vom Server geholt werden konnte.

Ab EspCoreVersion 2.6.0

Esp8266 NTP Lokalzeit als Arduino Tab.

Lokalzeit.ino

// ****************************************************************
// Sketch Esp8266 SNTP Lokalzeit Modular(Tab)
// created: Jens Fleischer, 2020-09-20
// last mod: Jens Fleischer, 2020-09-20
// For more information visit: https://fipsok.de
// ****************************************************************
// Hardware: Esp8266
// Software: Esp8266 Arduino Core 2.6.0 - 2.7.4
// Getestet auf: Nodemcu, Wemos D1 Mini Pro, Sonoff Switch, Sonoff Dual
/******************************************************************
  Copyright (c) 2020 Jens Fleischer. All rights reserved.

  This file is free software; you can redistribute it and/or
  modify it under the terms of the GNU Lesser General Public
  License as published by the Free Software Foundation; either
  version 2.1 of the License, or (at your option) any later version.
  This file is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  Lesser General Public License for more details.
*******************************************************************/
// Diese Version von Lokalzeit sollte als Tab eingebunden werden.
// #include <ESP8266WebServer.h> oder #include <ESP8266WiFi.h> muss im Haupttab aufgerufen werden.
// Funktion "setupTime();" muss im setup() nach dem Verbindungsaufbau aufgerufen werden.
// Automatische Umstellung zwischen Sommer- und Normalzeit.
// Inclusive Abfrage ob die Zeit vom NTP Server geholt werden konnte.
/**************************************************************************************/

#include <time.h>

const uint32_t SYNC_INTERVAL = 24;                                             // NTP Sync Interval in Stunden einstellen

struct tm tm;

const char* const PROGMEM NTP_SERVER[] = {"fritz.box", "de.pool.ntp.org", "at.pool.ntp.org", "ch.pool.ntp.org", "ptbtime1.ptb.de", "europe.pool.ntp.org"};
const char* const PROGMEM DAY_NAMES[] = {"Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"};
const char* const PROGMEM DAY_SHORT[] = {"So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"};
const char* const PROGMEM MONTH_NAMES[] = {"Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"};
const char* const PROGMEM MONTH_SHORT[] = {"Jan", "Feb", "Mrz", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez"};

extern "C" uint8_t sntp_getreachability(uint8_t);

bool getNtpServer(bool reply = false) {
  uint32_t timeout {millis()};
  configTime("CET-1CEST,M3.5.0/02,M10.5.0/03", NTP_SERVER[1], NTP_SERVER[4]);   // Zeitzone einstellen https://github.com/nayarsystems/posix_tz_db/blob/master/zones.csv
  do {
    delay(25);
    if (millis() - timeout >= 1e3) {
      Serial.printf(PSTR("Warten auf NTP-Antwort %2502ld sec\n"), (millis() - timeout) / 1000);
      delay(975);
    }
    sntp_getreachability(0) ? reply = true : sntp_getreachability(1) ? reply = true : sntp_getreachability(2) ? reply = true : false;
  } while (millis() - timeout <= 16e3 && !reply);
  return reply;
}

void setupTime() {
  bool timeSync = getNtpServer();
  Serial.printf(PSTR("NTP Synchronisation %s!\n\n"), timeSync ? "erfolgreich" : "fehlgeschlagen");
  server.on("/time", []() {
    server.send(200, "application/json", localTime());
  });
}

String localTime() {
  static char buf[26];                                    // je nach Format von "strftime" eventuell anpassen
  static time_t lastsec;
  time_t now = time(&now);
  localtime_r(&now, &tm);
  if (tm.tm_sec != lastsec) {
    lastsec = tm.tm_sec;
    Serial.println(DAY_NAMES[tm.tm_wday]);                      // druckt den aktuellen Tag
    Serial.println(MONTH_NAMES[tm.tm_mon]);                     // druckt den aktuellen Monat
    Serial.println(DAY_SHORT[tm.tm_wday]);                      // druckt den aktuellen Tag (Abk.)
    Serial.println(MONTH_SHORT[tm.tm_mon]);                     // druckt den aktuellen Monat (Abk.)
    strftime (buf, sizeof(buf), R"(["%T","%d.%m.%Y"])", &tm);  // http://www.cplusplus.com/reference/ctime/strftime/
    if (!(time(&now) % (SYNC_INTERVAL * 3600))) {
      bool timeSync = getNtpServer(true);
      Serial.printf(PSTR("NTP Synchronisation %s!\n"), timeSync ? "erfolgreich" : "fehlgeschlagen");
    }
  }
  return buf;
}

Die Webseite zur Esp8266 Uhrzeit.

zeit.html

<!DOCTYPE HTML> <!-- For more information visit: https://fipsok.de -->
<html lang="de">
  <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="style.css">
    <title>Uhrzeit</title>
    <script>
      function renew() {
        fetch('/time').then(function (response) {
          return response.json();
        }).then(function (array) {
          document.querySelector('span').innerHTML = array[0];;
        });
      }
      document.addEventListener('DOMContentLoaded', renew, setInterval(renew, 1000));
    </script>
    <style>
      body {
        padding: 10px;
        font-size: 3.2em;
      }
      main {
		display: flex;
        flex-direction: column;
        align-items: center;
        background-color: black;
        width: 280px;
        height: 100px;
        padding: .2em;
        border: .15em solid #aeaeab;
        box-shadow: 5px 10px 5px rgba(0, 0, 0, 0.7);
        border-radius: .2em;
      }
      span {
        color: #02fc07;
        position: relative;
        top: .5em;
        left: .1em;
        letter-spacing: .1em;
        font-weight: bold
      }
    </style>
  </head>
  <body>
    <main>
      <span></span>
    </main>
  </body>
</html>

Die "struct tm" enthält die Kalenderzeit.
Wenn du in deinem gesamten Sketch auf die Komponenten der Struktur zugreifen willst, verschiebe das includieren der "time.h" und deklarieren der "struct tm" vom Lokalzeit Tab in den Webserver Tab.

Der Aufruf der Funktion "localTime();" ist nach ausführen von "setupTime();" möglich.

Beispiel:

************** Zeitstempel im Setup ******************

void setup() {
 ......
 .........
  setupTime();
  Serial.println("Programmstart: " + localTime());
 ......
}

Du kannst den Aufruf der "localTime();" als Zeitstempel nutzen.

Beispiel:

******* Push Nachricht mit Text und Zeitstempel ******

pushbullet("Füllstand Minimum " + localTime());
Beispiel:

*************** Zeitstempel im Loop ******************

void loop() {
 ......
 .........
  static unsigned long letzteMillis = 0;
  unsigned long aktuelleMillis = millis();
  if (aktuelleMillis - letzteMillis >= 1000) {
    Serial.println(localTime());
    letzteMillis = aktuelleMillis;
  }
 ......
}
Beispiel:

************* Logdatei mit Zeitstempel ***************

File f = SPIFFS.open("/logdatei.txt", "a");
if (f && freeSpace(100)) {      // Anpassen an die zu schreibende Anzahl Byte
  f.printf("%s Event ausgelöst\n", localTime().c_str());
}
f.close();

Die Webseite zur Esp8266 Uhrzeit mit Datum.

zeitdatum.html

<!DOCTYPE HTML> <!-- For more information visit: https://fipsok.de -->
<html lang="de">
  <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="style.css">
    <title>Uhrzeit</title>
    <script>
      function renew() {
        fetch('/time').then(response => {
          return response.json();
        }).then(array => {
		  document.querySelector('#time').innerHTML = array[0];
          document.querySelector('#date').innerHTML = array[1];
        });
      }
      document.addEventListener('DOMContentLoaded', renew, setInterval(renew, 1000));
    </script>
    <style>
      body {
        padding: 10px;
        font-size: 3.2em;
      }
      main {
		display: flex;
        flex-direction: column;
        align-items: center;
        background-color: black;
        width: 280px;
        height: 140px;
        padding: .2em;
        border: .15em solid #aeaeab;
        box-shadow: 5px 10px 5px rgba(0, 0, 0, 0.7);
        border-radius: .2em;
      }
      span {
        color: #00ff05;
        position: relative;
        top: .3em;
        left: .1em;
        letter-spacing: .1em;
        font-weight: bold
      }
	  #date {
        font-size: .7em;
        margin-top: .5em;
      }
    </style>
  </head>
  <body>
    <main>
      <span id="time"></span>
      <span id="date"></span>
    </main>
  </body>
</html>