// 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 multiple time zones. // Jack Christensen Mar 2012 // // For time zone information: // http://www.timeanddate.com/worldclock/ #include // https://github.com/JChristensen/Timezone // Australia Eastern Time Zone (Sydney, Melbourne) TimeChangeRule aEDT = {"AEDT", First, Sun, Oct, 2, 660}; // UTC + 11 hours TimeChangeRule aEST = {"AEST", First, Sun, Apr, 3, 600}; // UTC + 10 hours Timezone ausET(aEDT, aEST); // Moscow Standard Time (MSK, does not observe DST) TimeChangeRule msk = {"MSK", Last, Sun, Mar, 1, 180}; Timezone tzMSK(msk); // Central European Time (Frankfurt, Paris) TimeChangeRule CEST = {"CEST", Last, Sun, Mar, 2, 120}; // Central European Summer Time TimeChangeRule CET = {"CET ", Last, Sun, Oct, 3, 60}; // Central European Standard Time Timezone CE(CEST, CET); // United Kingdom (London, Belfast) TimeChangeRule BST = {"BST", Last, Sun, Mar, 1, 60}; // British Summer Time TimeChangeRule GMT = {"GMT", Last, Sun, Oct, 2, 0}; // Standard Time Timezone UK(BST, GMT); // UTC TimeChangeRule utcRule = {"UTC", Last, Sun, Mar, 1, 0}; // UTC Timezone UTC(utcRule); // US Eastern Time Zone (New York, Detroit) TimeChangeRule usEDT = {"EDT", Second, Sun, Mar, 2, -240}; // Eastern Daylight Time = UTC - 4 hours TimeChangeRule usEST = {"EST", First, Sun, Nov, 2, -300}; // Eastern Standard Time = UTC - 5 hours Timezone usET(usEDT, usEST); // US Central Time Zone (Chicago, Houston) TimeChangeRule usCDT = {"CDT", Second, Sun, Mar, 2, -300}; TimeChangeRule usCST = {"CST", First, Sun, Nov, 2, -360}; Timezone usCT(usCDT, usCST); // US Mountain Time Zone (Denver, Salt Lake City) TimeChangeRule usMDT = {"MDT", Second, Sun, Mar, 2, -360}; TimeChangeRule usMST = {"MST", First, Sun, Nov, 2, -420}; Timezone usMT(usMDT, usMST); // Arizona is US Mountain Time Zone but does not use DST Timezone usAZ(usMST); // US Pacific Time Zone (Las Vegas, Los Angeles) TimeChangeRule usPDT = {"PDT", Second, Sun, Mar, 2, -420}; TimeChangeRule usPST = {"PST", First, Sun, Nov, 2, -480}; Timezone usPT(usPDT, usPST); void setup() { Serial.begin(115200); // set the system time to UTC // warning: assumes that compileTime() returns US EDT // adjust the following line accordingly if you're in another time zone setTime(compileTime() + 240 * 60); } void loop() { time_t utc = now(); Serial.println(); printDateTime(ausET, utc, "Sydney"); printDateTime(tzMSK, utc, " Moscow"); printDateTime(CE, utc, "Paris"); printDateTime(UK, utc, " London"); printDateTime(UTC, utc, " Universal Coordinated Time"); printDateTime(usET, utc, " New York"); printDateTime(usCT, utc, " Chicago"); printDateTime(usMT, utc, " Denver"); printDateTime(usAZ, utc, " Phoenix"); printDateTime(usPT, utc, " Los Angeles"); delay(10000); } // Function to return the compile date and time as a time_t value time_t compileTime() { const time_t FUDGE(10); // fudge factor to allow for compile time (seconds, YMMV) const char *compDate = __DATE__, *compTime = __TIME__, *months = "JanFebMarAprMayJunJulAugSepOctNovDec"; char chMon[3], *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 } // given a Timezone object, UTC and a string description, convert and print local time with time zone void printDateTime(Timezone tz, time_t utc, const char *descr) { char buf[40]; char m[4]; // temporary storage for month string (DateStrings.cpp uses shared buffer) TimeChangeRule *tcr; // pointer to the time change rule, use to get the TZ abbrev time_t t = tz.toLocal(utc, &tcr); 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), tcr -> abbrev); Serial.print(buf); Serial.print(' '); Serial.println(descr); }