Timezone Clock
#include <Timezone.h>
/*H********************************************************************
Arduino Timezone Library Copyright (C) 2018 by Jack Christensen and
licensed under GNU GPL v3.0, https://www.gnu.org/licenses/gpl.html
Arduino Timezone Library example sketch.
Self-adjusting clock for one time zone.
TimeChangeRules can be hard-coded or read from EEPROM, see comments.
Jack Christensen Mar 2012
**********************************************************************/
#include <Timezone.h>   // https://github.com/JChristensen/Timezone

//************************* DEFINES ************************************

//************************* PROTOTYPES ************************************
time_t compileTime();
void printDateTime( time_t t, const char *tz );

//************************* VARIABLES ************************************
// US Eastern Time Zone (New York, Detroit)
TimeChangeRule myDST = {"EDT", Second, Sun, Mar, 2, -240};    // Daylight time = UTC - 4 hours
TimeChangeRule mySTD = {"EST", First, Sun, Nov, 2, -300};     // Standard time = UTC - 5 hours
Timezone myTZ(myDST, mySTD);

// If TimeChangeRules are already stored in EEPROM, comment out the three
// lines above and uncomment the line below.
//Timezone myTZ(100);       // assumes rules stored at EEPROM address 100

TimeChangeRule *tcr;        // pointer to the time change rule, use to get TZ abbrev

/*F********************************************************************
*
**********************************************************************/
void 
setup()
{
	Serial.begin( BAUD );
	setTime( myTZ.toUTC( compileTime()) );
// another way to set time (hr,min,sec,day,mnth,yr)
//setTime( 01, 55, 00, 11, 3, 2012 );
}
/*F********************************************************************
*
**********************************************************************/
void 
loop()
{
	time_t utc = now();
	time_t local = myTZ.toLocal( utc, &tcr);
	Serial.println();
	printDateTime( utc, "UTC" );
	printDateTime( local, tcr->abbrev );
	delay( 10000 );
}
/*F********************************************************************
* Function to return the compile date and time as a time_t value
**********************************************************************/
time_t 
compileTime()
{
	const time_t FUDGE( 10 );// fudge factor for compile time (seconds, 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 month string stg (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);
	Serial.println( buf );
}