NodeMCU Internet Clock
Internet Clock
Example 1
Example 2

This little project with the NodeMCU and a TM1637 4-Bits Digital LED connects to at NTP Server This is a 12hr clock with Daylight Savings and None Daylight Savings Sketches

PARTS
1 x WeMos D1 USB NodeMcu Lua V3 CH340G ESP8266 Wireless Internet Development 5-9V
or
1 x NodeMCU Lua ESP8266 ESP-12 WeMos D1 Mini WIFI
1 x TM1637 4-Bits Digital LED Display
1 x 85x58x33mm Waterproof Clear Cover Plastic Project Box
1 x Light Dependent Resister
2 x 10k Ohm Resisters
1 x PUSH BUTTON
1 x Small PCB to mount the component, not needed if you just want to run jumber wires.
Small 5v phone charger, I like to use a genuine brand

In the below picture you can see that I put two standoffs to hold the LED Display off the NodeMCU and at the other end the pins do the work where it plugs into the PCB, You may need to ajust the hights of the standoffs with a file and solder the pin shocket off the PCB a little, my socket had long soldering pins, I made this so when the cover is on, the Display is againt the inside of the cover. I cut a piece of paper to go between the Display and the cover to deffuse the Display.

click picture to enlarge

Below are the Sketches for Daylight Savings and none Daylight Savings regones that work, it may not be the best put you can change it to suit your own designs

Example 1
/*H*******************************************************
 MerrittSoft
 Internet Clock with Daylight Savings
 30/01/2020
 Language: C++/Arduino
 Thank you to those people that made the Libarays in this project posable.
********************************************************/
#include <TM1637Display.h>
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include <ESP8266WebServer.h>
#include <WiFiManager.h> // here I have used the WiFiManager Library to connect to the wifi,
 //I have found that it dosen't always connect after power on, thats why i add a restet button
#include <DNSServer.h>
#include <TimeLib.h> //For more information in the TimeLib Library, Please read PaulStoffregen library Arduino Time.
#include <Timezone.h> // To understand how to setup the timezones and daylight saving times,
 //please read Jack Christensen Library Arduino Timezone.

//************************* DEFINES ************************************
#define  BAUD  9600
#define DIO D5           // Display pins on Arduino
#define CLK D6
// part of fixed wifi ssid and password
//const char ssid[] = "SSID"; // your network SSID (name)
//const char pass[] = "PASSWORD"; // your network password

//************************* PROTOTYPES ************************************
time_t getNtpTime();
void digitalClockDisplay();
void printDigits( int digits );
void sendNTPpacket( IPAddress &address );

//************************* VARIABLES ************************************
TimeChangeRule aEDT = {"AEDT", First, Sun, Oct, 2, 660}; // UTC + 11 hours For Sydney Australia, fron Timezone library
TimeChangeRule aEST = {"AEST", First, Sun, Apr, 3, 600}; // UTC + 10 hours For Sydney Australia fron Timezone library
Timezone ausET( aEDT, aEST);
int sensorPin = A0;
int formattedTimemin = 0;
int formattedTimehour = 0;
int sensorValue = 0;
TM1637Display display( CLK, DIO);
// NTP Servers:
static const char ntpServerName[] = "3.oceania.pool.ntp.org"; // replace this NTP Server with one that is closer to your location
//static const char ntpServerName[] = "time.nist.gov";
//static const char ntpServerName[] = "time-a.timefreq.bldrdoc.gov";
//static const char ntpServerName[] = "time-b.timefreq.bldrdoc.gov";
//static const char ntpServerName[] = "time-c.timefreq.bldrdoc.gov";
int timeZone = 0; // GMT Timezone handled from Timezone library, ajust above
WiFiUDP   Udp;
unsigned int localPort = 8888; // local port to listen for UDP packets
TimeChangeRule *tcr;
const int NTP_PACKET_SIZE = 48; // NTP time is in the first 48 bytes of message
byte packetBuffer[NTP_PACKET_SIZE]; //buffer to hold incoming & outgoing packets
time_t prevDisplay = 0; // when the digital clock was displayed

/*F********************************************************************
*
**********************************************************************/
void 
setup()
{
    WiFiManager wifiManager;     // part of wifimanager Library
    Serial.begin( BAUD );
     while( !Serial); // Needed for Leonardo only
         delay( 250 );
    Serial.println( "TimeNTP Example");
     // part of the wifimanager Library
     wifiManager.autoConnect( "Internet-Clock");
     // part of the fixed wifi ssid and password
     // Serial.print("Connecting to ");
     //Serial.println(ssid);
     // WiFi.begin(ssid, pass);
     //while (WiFi.status() != WL_CONNECTED) 
        //{
     // delay(500);
     // Serial.print(".");
     // }
    Serial.print("IP number assigned by DHCP is ");
    Serial.println( WiFi.localIP());
    Serial.println("Starting UDP");
     Udp.begin( localPort );
    Serial.print( "Local port: ");
    Serial.println( Udp.localPort());
    Serial.println("waiting for sync");
     setSyncProvider(getNtpTime);
     setSyncInterval(300);
}
/*F********************************************************************
*
**********************************************************************/
void 
loop()
{
    delay(10000); // time update every 10 seconds
    time_t utc = now();
    time_t local = ausET.toLocal(utc, &tcr);
    Serial.println();
    printDateTime(local, tcr -> abbrev);
    sensorValue = analogRead(sensorPin);
    if( sensorValue < 15) 
        display.setBrightness( 0x01 );
    else if( sensorValue < 50 ) 
        display.setBrightness( 0x03 );
    else 
        display.setBrightness( 0x07 );
    if( timeStatus() != timeNotSet) 
    {
        if( now() != prevDisplay) //update the display only if time has changed
            prevDisplay = now();
    }
    // change 24hr to 12hr
    if( formattedTimehour > 12 ) 
        morethen12();
    if( formattedTimehour < 1 ) 
        lessthenone();
    digitalClockDisplay();
}
/*F********************************************************************
*
**********************************************************************/
void 
digitalClockDisplay()
{
    // digital clock display of the time
    Serial.println() ;
    Serial.print( hour() ) ;
    printDigits( minute() ) ;
    printDigits( second() ) ;
    Serial.print( " ") ;
    Serial.print( day() ) ;
    Serial.print( ".") ;
    Serial.print( month() ) ;
    Serial.print( ".") ;
    Serial.print( year() ) ;
    Serial.println() ;
    Serial.print( sensorValue) ;  
    Serial.print( "sensorValue ") ;  
    Serial.print( sensorValue) ;
    // send to display
    display.showNumberDecEx( formattedTimehour * 100 + formattedTimemin
        , 0b01000000 , false, 4, 0) ;
}
/*F********************************************************************
*
**********************************************************************/
void 
printDigits( int digits )
{
    // utility for digital clock display: prints preceding colon and leading 0
    Serial.print(":");
    if( digits < 10 )
        Serial.print('0');
    Serial.print( digits );
}
/*F********************************************************************
* Function to return the compile date and time as a time_t value
**********************************************************************/
time_t 
compileTime()
{
    const time_t FUDGE(10); // ADJ to allow for compile time (sec, YMMV)
    const char *compDate = __DATE__, *compTime = __TIME__
        , *months = "JanFebMarAprMayJunJulAugSepOctNovDec";
    char chMon[4], *m;
    tmElements_t tm;
    strncpy( chMon, compDate, 3);
    chMon[3] = '\0';
    m = strstr( months, chMon);
    tm.Month = ( (m - months) / 3 + 1);
    tm.Day = atoi( compDate + 4);
    tm.Year = atoi( compDate + 7) - 1970;
    tm.Hour = atoi( compTime);
    tm.Minute = atoi( compTime + 3);
    tm.Second = atoi( compTime + 6);
    time_t t = makeTime( tm );
    return t + FUDGE; // add fudge factor to allow for compile time
}
/*F********************************************************************
* format and print a time_t value, with a time zone appended.
**********************************************************************/
void 
printDateTime( time_t t, const char *tz)
{
    char buf[32];
    char m[4]; // temp stg for month string (DateStrings.cpp uses shared buffer)
    strcpy( m, monthShortStr( month( t )));
    sprintf( buf, "%.2d:%.2d:%.2d %s %.2d %s %d %s",
        hour(t), minute(t), second(t), dayShortStr(weekday(t)), day(t)
        , m, year(t), tz);
    // put hours and minutes into formattedTimehour and formattedTimemin for sending to display after its converted to 12hr time
    formattedTimemin = minute(t);
    formattedTimehour = hour(t);
    Serial.println( buf );
}
/*F********************************************************************
*
**********************************************************************/
time_t 
getNtpTime()
{
    IPAddress ntpServerIP; // NTP server's ip address
    while( Udp.parsePacket() > 0) ; // discard previously rcve pkts
    Serial.println("Transmit NTP Request");
    // get a random server from the pool
    WiFi.hostByName(ntpServerName, ntpServerIP);
    Serial.print(ntpServerName);
    Serial.print(": ");
    Serial.println(ntpServerIP);
    sendNTPpacket(ntpServerIP);
    uint32_t beginWait = millis();
    while (millis() - beginWait < 1500) {
    int size = Udp.parsePacket();
    if( size >= NTP_PACKET_SIZE) {
    Serial.println("Receive NTP Response");
    Udp.read(packetBuffer, NTP_PACKET_SIZE); // read packet into the buffer
    unsigned long secsSince1900;
    // convert four bytes starting at location 40 to a long integer
    secsSince1900 = (unsigned long)packetBuffer[40] << 24;
    secsSince1900 |= (unsigned long)packetBuffer[41] << 16;
    secsSince1900 |= (unsigned long)packetBuffer[42] << 8;
    secsSince1900 |= (unsigned long)packetBuffer[43];
    return secsSince1900 - 2208988800UL + timeZone * SECS_PER_HOUR;
    }
    }
    Serial.println("No NTP Response :-(");
    return 0; // return 0 if unable to get the time
}
/*F********************************************************************
* send an NTP request to the time server at the given address
**********************************************************************/
void 
sendNTPpacket( IPAddress &address)
{
    // set all bytes in the buffer to 0
    memset(packetBuffer, 0, NTP_PACKET_SIZE);
    // Initialize values needed to form NTP request
    // (see URL above for details on the packets)
    packetBuffer[0] = 0b11100011; // LI, Version, Mode
    packetBuffer[1] = 0; // Stratum, or type of clock
    packetBuffer[2] = 6; // Polling Interval
    packetBuffer[3] = 0xEC; // Peer Clock Precision
    // 8 bytes of zero for Root Delay & Root Dispersion
    packetBuffer[12] = 49;
    packetBuffer[13] = 0x4E;
    packetBuffer[14] = 49;
    packetBuffer[15] = 52;
    // all NTP fields have been given values, now
    // you can send a packet requesting a timestamp:
    Udp.beginPacket(address, 123); //NTP requests are to port 123
    Udp.write(packetBuffer, NTP_PACKET_SIZE);
    Udp.endPacket();
}
/*F********************************************************************
*
**********************************************************************/
void 
morethen12() 
{
    formattedTimehour = formattedTimehour - 12;
}
/*F********************************************************************
*
**********************************************************************/
void 
lessthenone() 
{
    formattedTimehour = formattedTimehour + 12;
}
Example 2
/*H******************************************************* 
MerrittSoft Internet Clock, No Daylight Savings 30/01/2020
Language: C++/Arduino Thank you to those people that made the Libarays in this project posable.
********************************************************/
#include <TM1637Display.h>
#include <ESP8266WiFi.h>
#include <WiFiUdp .h>
#include <ESP8266WebServer.h>
//#include <WiFiManager.h> 
// here I have used the WiFiManager Library to connect to the wifi,
//I have found that it dosen't always connect after power on, thats why I add a reset button.
//#include <DNSServer.h> // Needed for the WiFiManager library.
#include <TimeLib.h> 
//For more info on TimeLib Library, Please read PaulStoffregen librart Arduino Time.

//************************* DEFINES ************************************
#define DIO D5#define CLK D6
typedef unsinged long ulong;
typedef unsinged int  uint;

//************************* PROTOTYPES ************************************

//************************* VARIABLES ************************************
int sensorPin = A0;
int formattedTimemin = 0;
int formattedTimehour = 0;
int sensorValue = 0;
TM1637Display display( CLK, DIO);
const char ssid[] = "ssid"; // your network SSID (name)
const char pass[] = "password"; // your network password
// NTP Servers:static const char ntpServerName[] = "3.oceania.pool.ntp.org"; 
// replace this NTP Server with one that is closer to your location
//static const char ntpServerName[] = "time.nist.gov";
//static const char ntpServerName[] = "time-a.timefreq.bldrdoc.gov";
//static const char ntpServerName[] = "time-b.timefreq.bldrdoc.gov";
//static const char ntpServerName[] = "time-c.timefreq.bldrdoc.gov";
int timeZone = +11; // Change this to your Timezone
//const int timeZone = -5; 
// Eastern Standard Time (USA)
//const int timeZone = -4; 
// Eastern Daylight Time (USA)
//const int timeZone = -8; 
// Pacific Standard Time (USA)
//const int timeZone = -7; 
// Pacific Daylight Time (USA)
WiFiUDP Udp;
unsigned int localPort = 8888; // local port to listen for UDP packets
time_t getNtpTime();
void digitalClockDisplay();
void printDigits( int digits);
void sendNTPpacket( IPAddress &address);
time_t prevDisplay = 0; // when digital clock was displayed
const int NTP_PACKET_SIZE = 48;     // NTP TIME IN FIRST 48 BYTES OF MESSAGE
byte packetBuffer[NTP_PACKET_SIZE];       // INCOMING & OUTGOING PACKETS

/*F********************************************************************
*
**********************************************************************/
void 
setup()
{
    // part of wifimanager Library
    //WiFiManager wifiManager;
    // part of wifimanager Library
    //wifiManager.autoConnect("Internet-Clock");
    Serial.begin( BAUD );
    while( !Serial) ;                      // Needed for Leonardo only 
        delay( 250 );
    Serial.println( "TimeNTP Example");
    Serial.print( "Connecting to ");
    Serial.println( ssid );
    WiFi.begin( ssid, pass );
    while( WiFi.status() != WL_CONNECTED) 
    { 
        delay(500); 
        Serial.print("."); 
    }
    Serial.print( "IP number assigned by DHCP is "); 
    Serial.println( WiFi.localIP()); 
    Serial.println( "Starting UDP"); Udp.begin(localPort); 
    Serial.print( "Local port: "); 
    Serial.println( Udp.localPort()); 
    Serial.println( "waiting for sync"); 
    setSyncProvider( getNtpTime ); 
    setSyncInterval( 300 );
}
/*F********************************************************************
*
**********************************************************************/
void 
loop()
{
    delay( 10000 ); // time update every 10 seconds
    sensorValue = analogRead( sensorPin );
    if( sensorValue < 15 ) 
        display.setBrightness( 0x01 ); 
    else if( sensorValue < 50 ) 
        display.setBrightness( 0x03 ); 
    else 
        display.setBrightness( 0x07 ); 
    if( timeStatus() != timeNotSet) 
    { 
        if( now() != prevDisplay) 
        { 
            //update display only if time has changed 
            prevDisplay = now(); 
            //digitalClockDisplay(); 
        } 
    }
    formattedTimehour = hour();
    if( formattedTimehour > 12 ) 
        morethen12(); 
    if( formattedTimehour < 1 ) 
        lessthenone(); 
    digitalClockDisplay();
}
/*F********************************************************************
*
**********************************************************************/
void 
digitalClockDisplay()
{ // digital clock display of the time 
    Serial.println(); 
    Serial.print( hour()); 
    printDigits( minute()); 
    printDigits( second()); 
    Serial.print( " ");
    Serial.print( day()); 
    Serial.print( "."); 
    Serial.print( month()); 
    Serial.print( "."); 
    Serial.print( year()); 
    Serial.println(); 
    Serial.print( "sensorValue "); 
    Serial.print( sensorValue);
     // send to display 
    display.showNumberDecEx( formattedTimehour * 100 + minute(), 0b01000000
        , false, 4, 0);
}
/*F********************************************************************
* digital clock display: prints preceding colon and leading 0 
**********************************************************************/
void 
printDigits( int digits )
{
    Serial.print( ":" ); 
    if( digits < 10 ) 
    Serial.print( '0' ); 
    Serial.print( digits );
}
/*F********************************************************************
*
**********************************************************************/
time_t 
getNtpTime()
{ 
    IPAddress ntpServerIP;                        // NTP SERVER'S IP ADDRESS
    while( Udp.parsePacket() > 0) ;                     // CLEAR PKT BUFF
    Serial.println( "Transmit NTP Request");  // GET RANDOM SERVER FROM POOL
    WiFi.hostByName( ntpServerName, ntpServerIP); 
    Serial.print( ntpServerName ); 
    Serial.print( ": "); 
    Serial.println( ntpServerIP ); 
    sendNTPpacket( ntpServerIP ); 
    uint32_t beginWait = millis(); 
    while( millis() - beginWait < 1500) 
    { 
        int size = Udp.parsePacket(); 
        if( size >= NTP_PACKET_SIZE) 
        {
            Serial.println( "Receive NTP Response"); 
            Udp.read( packetBuffer, NTP_PACKET_SIZE);                  // RD PKT
            ulong secsSince1900; // chng 4 bytes at location 40 to a 
            long integer secsSince1900 = (ulong)packetBuffer[40] << 24;
            secsSince1900 |= (ulong)packetBuffer[41] << 16; 
            secsSince1900 |= (ulong)packetBuffer[42] << 8; 
            secsSince1900 |= (ulong)packetBuffer[43]; 
            return( secsSince1900 - 2208988800UL + timeZone * SECS_PER_HOUR ); 
        } 
    } 
    Serial.println( "No NTP Response :-("); 
    return( 0 );                           // RETURN 0 IF UNABLE TO GET TIME
}
/*F********************************************************************
* send an NTP request to the time server at the given address
**********************************************************************/
void 
sendNTPpacket( IPAddress &address )
{ // set all bytes in the buffer to 0 
    memset( packetBuffer, 0, NTP_PACKET_SIZE); // Init vals for NTP request 
    // (see URL above for details on the packets) 
    packetBuffer[0] = 0b11100011; 
    packetBuffer[1] = 0; // LI, Version, Mode 
    packetBuffer[2] = 6; // Polling Interval // Stratum, or type of clock 
    packetBuffer[3] = 0xEC; // Peer Clock Precision 
    // 8 bytes of zero for Root Delay & Root Dispersion 
    packetBuffer[12] = 49; 
    packetBuffer[13] = 0x4E; 
    packetBuffer[14] = 49; 
    packetBuffer[15] = 52; // all NTP fields have been given values, now 
    // you can send a packet requesting a timestamp: 
    Udp.beginPacket( address, 123); //NTP requests are to port 123 
    Udp.write( packetBuffer, NTP_PACKET_SIZE); 
    Udp.endPacket();
}
/*F********************************************************************
*
**********************************************************************/
void 
morethen12() 
{ 
    formattedTimehour = formattedTimehour - 12;
}
/*F********************************************************************
*
**********************************************************************/
void 
lessthenone() 
{ 
    formattedTimehour = formattedTimehour + 12;
}