• Stars
    star
    279
  • Rank 147,967 (Top 3 %)
  • Language
    C++
  • License
    GNU General Publi...
  • Created over 12 years ago
  • Updated 7 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Arduino library to facilitate time zone conversions and automatic daylight saving (summer) time adjustments.

Arduino Timezone Library

https://github.com/JChristensen/Timezone
README file
Jack Christensen
Mar 2012

License

Arduino Timezone Library Copyright (C) 2018 Jack Christensen GNU GPL v3.0

This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License v3.0 as published by the Free Software Foundation.

This program 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 General Public License for more details.

You should have received a copy of the GNU General Public License along with this program. If not, see https://www.gnu.org/licenses/gpl.html

Introduction

The Timezone library is designed to work in conjunction with the Arduino Time library, which must also be installed on your system. This documentation assumes some familiarity with the Time library.

The primary aim of the Timezone library is to convert Universal Coordinated Time (UTC) to the correct local time, whether it is daylight saving time (a.k.a. summer time) or standard time. The time source could be a GPS receiver, an NTP server, or a Real-Time Clock (RTC) set to UTC. But whether a hardware RTC or other time source is even present is immaterial, since the Time library can function as a software RTC without additional hardware (although its accuracy is dependent on the accuracy of the microcontroller's system clock.)

The Timezone library implements two objects to facilitate time zone conversions:

  • A TimeChangeRule object describes when local time changes to daylight (summer) time, or to standard time, for a particular locale.
  • A Timezone object uses TimeChangeRules to perform conversions and related functions. It can also write its TimeChangeRules to EEPROM, or read them from EEPROM. Multiple time zones can be represented by defining multiple Timezone objects.

Examples

The following example sketches are included with the Timezone library:

  • Clock: A simple self-adjusting clock for a single time zone. TimeChangeRules may be optionally read from EEPROM.
  • HardwareRTC: A self-adjusting clock for one time zone using an external real-time clock, either a DS1307 or DS3231 (e.g. Chronodot) which is set to UTC.
  • WorldClock: A self-adjusting clock for multiple time zones.
  • WriteRules: A sketch to write TimeChangeRules to EEPROM.
  • Change_TZ_1: Changes between time zones by modifying the TimeChangeRules.
  • Change_TZ_2: Changes between time zones by selecting from an array of Timezone objects.

Coding TimeChangeRules

Normally these will be coded in pairs for a given time zone: One rule to describe when daylight (summer) time starts, and one to describe when standard time starts.

As an example, here in the Eastern US time zone, Eastern Daylight Time (EDT) starts on the 2nd Sunday in March at 02:00 local time. Eastern Standard Time (EST) starts on the 1st Sunday in November at 02:00 local time.

Define a TimeChangeRule as follows:

TimeChangeRule myRule = {abbrev, week, dow, month, hour, offset};

Where:

abbrev is a character string abbreviation for the time zone; it must be no longer than five characters.

week is the week of the month that the rule starts.

dow is the day of the week that the rule starts.

hour is the hour in local time that the rule starts (0-23).

offset is the UTC offset in minutes for the time zone being defined.

For convenience, the following symbolic names can be used:

week: First, Second, Third, Fourth, Last
dow: Sun, Mon, Tue, Wed, Thu, Fri, Sat
month: Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec

For the Eastern US time zone, the TimeChangeRules could be defined as follows:

TimeChangeRule usEDT = {"EDT", Second, Sun, Mar, 2, -240};  //UTC - 4 hours
TimeChangeRule usEST = {"EST", First, Sun, Nov, 2, -300};   //UTC - 5 hours

Coding Timezone objects

There are three ways to define Timezone objects.

By first defining TimeChangeRules (as above) and giving the daylight time rule and the standard time rule (assuming usEDT and usEST defined as above):
Timezone usEastern(usEDT, usEST);

For a time zone that does not change to daylight/summer time, pass a single rule to the constructor. For example:
Timezone usAZ(usMST, usMST);

By reading rules previously stored in EEPROM. This reads both the daylight and standard time rules previously stored at EEPROM address 100:
Timezone usPacific(100);

Note that TimeChangeRules require 12 bytes of storage each, so the pair of rules associated with a Timezone object requires 24 bytes total. This could possibly change in future versions of the library. The size of a TimeChangeRule can be checked with sizeof(usEDT).

Timezone library methods

Note that the time_t data type is defined by the Arduino Time library <TimeLib.h>. See the Time library documentation here and here for additional details.

time_t toLocal(time_t utc);

Description

Converts the given UTC time to local time, standard or daylight as appropriate.

Syntax

myTZ.toLocal(utc);

Parameters

utc: Universal Coordinated Time (time_t)

Returns

Local time (time_t)

Example
time_t eastern, utc;
TimeChangeRule usEDT = {"EDT", Second, Sun, Mar, 2, -240};  //UTC - 4 hours
TimeChangeRule usEST = {"EST", First, Sun, Nov, 2, -300};   //UTC - 5 hours
Timezone usEastern(usEDT, usEST);
utc = now();	//current time from the Time Library
eastern = usEastern.toLocal(utc);

time_t toLocal(time_t utc, TimeChangeRule **tcr);

Description

As above, converts the given UTC time to local time, and also returns a pointer to the TimeChangeRule that was applied to do the conversion. This could then be used, for example, to include the time zone abbreviation as part of a time display. The caller must take care not to alter the pointed TimeChangeRule, as this will then result in incorrect conversions.

Syntax

myTZ.toLocal(utc, &tcr);

Parameters

utc: Universal Coordinated Time (time_t)
tcr: Address of a pointer to a TimeChangeRule (**TimeChangeRule)

Returns

Local time (time_t)
Pointer to TimeChangeRule (**TimeChangeRule)

Example
time_t eastern, utc;
TimeChangeRule *tcr;
TimeChangeRule usEDT = {"EDT", Second, Sun, Mar, 2, -240};  //UTC - 4 hours
TimeChangeRule usEST = {"EST", First, Sun, Nov, 2, -300};   //UTC - 5 hours
Timezone usEastern(usEDT, usEST);
utc = now();	//current time from the Time Library
eastern = usEastern.toLocal(utc, &tcr);
Serial.print("The time zone is: ");
Serial.println(tcr -> abbrev);

bool utcIsDST(time_t utc);

bool locIsDST(time_t local);

Description

These functions determine whether a given UTC time or a given local time is within the daylight saving (summer) time interval, and return true or false accordingly.

Syntax

utcIsDST(utc);
locIsDST(local);

Parameters

utc: Universal Coordinated Time (time_t)
local: Local Time (time_t)

Returns

true or false (bool)

Example

if (usEastern.utcIsDST(utc)) { /*do something*/ }

void readRules(int address);

void writeRules(int address);

Description

These functions read or write a Timezone object's two TimeChangeRules from or to EEPROM.

Syntax

myTZ.readRules(address);
myTZ.writeRules(address);

Parameters

address: The beginning EEPROM address to write to or read from (int)

Returns

None.

Example

usEastern.writeRules(100); //write rules beginning at EEPROM address 100

void setRules(TimeChangeRule dstStart, TimeChangeRule stdStart);

Description

This function reads or updates the daylight and standard time rules from RAM. Can be used to change TimeChangeRules dynamically while a sketch runs.

Syntax

myTZ.setRules(dstStart, stdStart);

Parameters

dstStart: A TimeChangeRule denoting the start of daylight saving (summer) time.
stdStart: A TimeChangeRule denoting the start of standard time.

Returns

None.

Example
TimeChangeRule EDT = {"EDT", Second, Sun, Mar, 2, -240};
TimeChangeRule EST = {"EST", First, Sun, Nov, 2, -300};
Timezone ET(EDT, EST);
...
tz.setRules(EDT, EST);

time_t toUTC(time_t local);

Description

Converts the given local time to UTC time.

WARNING: This function is provided for completeness, but should seldom be needed and should be used sparingly and carefully.

Ambiguous situations occur after the Standard-to-DST and the DST-to-Standard time transitions. When changing to DST, there is one hour of local time that does not exist, since the clock moves forward one hour. Similarly, when changing to standard time, there is one hour of local time that occurs twice since the clock moves back one hour.

This function does not test whether it is passed an erroneous time value during the Local-to-DST transition that does not exist. If passed such a time, an incorrect UTC time value will be returned.

If passed a local time value during the DST-to-Local transition that occurs twice, it will be treated as the earlier time, i.e. the time that occurs before the transition.

Calling this function with local times during a transition interval should be avoided!

Syntax

myTZ.toUTC(local);

Parameters

local: Local Time (time_t)

Returns

UTC (time_t)

More Repositories

1

JC_Button

Arduino library to debounce button switches, detect presses, releases, and long presses
C++
423
star
2

DS3232RTC

Arduino Library for Maxim Integrated DS3232 and DS3231 Real-Time Clocks
C++
393
star
3

Timer

A fork of Simon Monk's Arduino Timer library
C++
372
star
4

tinySPI

Arduino hardware SPI library for ATtiny44/84, 45/85, 461/861, 2313/4313.
C++
154
star
5

extEEPROM

Arduino library to support external I2C EEPROMs.
C++
114
star
6

movingAvg

A simple Arduino library for calculating moving averages.
C++
90
star
7

MCP79412RTC

Arduino library for the Microchip MCP79411/12 Real-Time Clock/Calendar
C++
22
star
8

CurrentTransformer

Arduino Current Transformer Library
C++
16
star
9

mini1284

A minimal breadboard-friendly design for the ATmega1284P MCU
16
star
10

JC_EEPROM

Arduino library to support external I2C EEPROMs.
C++
14
star
11

usb-condom

A little something for the tinfoil hat crowd.
13
star
12

Thermocouple

Thermocouple library for Arduino and MAX6675
Java
11
star
13

millionOhms_SW

Warning One Million Ohms (firmware): Amuse your friends and confuse your enemies! Keep the uninititated away from your desk or out of your lab!
C++
10
star
14

PowerOutageMonitor_SW

Sketch for an Arduino-based Power Outage Logger
C++
9
star
15

TinyWireM

My modifications to the TinyWireM library from the Arduino Playground
C++
8
star
16

serialLogger

An Arduino-Compatible Serial Data Logger
C++
8
star
17

JC_Sunrise

Arduino library to calculate sunrise and sunset times.
C++
8
star
18

PowerOutageMonitor_HW

Arduino-Based Power Outage Logger PC Board
8
star
19

tinyTorch

Hardware design for a small LED flashlight powered by an ATtiny84A.
Eagle
6
star
20

MCP9808

Arduino Library for Microchip MCP9808 Maximum Accuracy Digital Temperature Sensor
C++
6
star
21

gpsFreq

Arduino frequency counter library, uses a 1 Hz (PPS) signal from a GPS receiver as an accurate time base
C++
6
star
22

nightLight

An Arduino-based demonstration/educational project with several interesting hardware and software features.
Java
5
star
23

rtc79412

Breakout Board for the Microchip MCP79412 Real-Time Clock/Calendar
5
star
24

geiger

Firmware for the MightyOhm Geiger Counter
C
4
star
25

tinyTorch-fw

Firmware for a small LED flashlight powered by an ATtiny84A.
C++
4
star
26

ledFire_HW

LED PWM Fire Effect using ATtiny84A (hardware design)
3
star
27

FiveLEDs

My spin on Technoblogy's Five LEDs Puzzle.
C++
3
star
28

ledFire_FW

LED PWM Fire Effect using ATtiny84A (firmware)
Arduino
3
star
29

aaLogger_SW

Code for the Double-A DataLogger - A low-power Arduino-based data logger.
Arduino
3
star
30

GroveStreams

GroveStreams Library for Arduino
C++
3
star
31

ds18b20

C++
3
star
32

CurrentMonitor

Arduino-compatible board to measure AC mains current with current transformers
2
star
33

piXBee

Interfaces Andrew Rapp's XBee-Arduino library to C++ running on a Raspberry Pi.
C++
2
star
34

jcGoldieClock

My firmware for LarryD's Goldie Clock
C++
2
star
35

MCP9800

Arduino Library for Microchip MCP9800/1/2/3 2-Wire High-Accuracy Temperature Sensors
C++
2
star
36

larson84

Firmware for the tinyLarson scanner
C++
2
star
37

jc_MAX31856

Arduino library for the Maxim Integrated MAX31856 Thermocouple to Digital Converter
C++
2
star
38

tinyLarson

Larson scanner powered by an ATtiny84a
2
star
39

tinyTimer

A small battery-operated timer based on an ATtiny84A.
1
star
40

rtc7941x

MCP78411/12 RTC Break-Out Board with MCP9800/2 Temperature Sensor
1
star
41

aaLogger_HW

Schematic and board for the Double-A DataLogger - A low-power Arduino-based data logger.
1
star
42

Vetinari_SW

Arduino
1
star
43

aaXBee_HW

Double-A XBee Sensor Node
Eagle
1
star
44

Vetinari_HW

1
star
45

xmasCandles

Arduino-powered Christmas Window Candles
Arduino
1
star
46

gsXBee

Arduino XBee Library for GroveStreams Wireless Sensor Network
C++
1
star
47

bbhTinyX5

ATtinyX5 Breadboard Helper, the easiest way to breadboard an ATtiny microcontroller!
1
star
48

entropyTest

A sketch to test the Arduino Entropy library at http://code.google.com/p/avr-hardware-random-number-generation/ and capture the data to an SD card.
Arduino
1
star
49

dotstar4

Simple board to hold four APA102C addressable RGB LEDs.
1
star
50

Ethernet

A modified version of the Ethernet library from Arduino 1.8.5 that supports both the WIZnet W5100 and W5200 chips.
C++
1
star
51

ac-timer-panel

Small PCB to support switch and LEDs for AC timer project.
1
star
52

bbhTinyX4

ATtinyX4 Breadboard Helper, the easiest way to breadboard an ATtiny microcontroller!
1
star
53

ac-timer-hw

Arduino-based daily timer for AC appliances.
1
star
54

aaXBee

Arduino-based wireless sensor node using XBee-ZB. Powered by two AA cells.
C++
1
star
55

Trace

Bash script to run traceroute for a given IP and log the results to a file.
Shell
1
star
56

backup

A simple rsync backup script
Shell
1
star
57

dehumid

A daily timer sketch for Arduino to control a 120VAC appliance according to a schedule with a solid-state relay.
C++
1
star
58

Minimal-Sensor-Network

A minimal Arduino/XBee/Pachube sensor network
1
star
59

Arduino-Breadboard-Helpers

Two small breakout boards that make building an Arduino-compatible breadboard a snap!
1
star