# Convert to and from Unix Timestamp

What is the best way to convert between date, hours, min, seconds to Unix timestamp in milliseconds in Arduino? I need to have this conversion, since I'm using RTC (date, hours, min, secs etc) and communicating Unix timestamp over BLE

I found some snippet of codes online, but have not tested it extensively yet.

``````  byte second = epoch%60; epoch /= 60;
byte minute = epoch%60; epoch /= 60;
byte hour   = epoch%24; epoch /= 24;

unsigned int years = epoch/(365*4+1)*4; epoch %= 365*4+1;
unsigned int year;
for (year=3; year>0; year--)
{
if (epoch >= days[year][0])
break;
}

unsigned int month;
for (month=11; month>0; month--)
{
if (epoch >= days[year][month])
break;
}

year  = years+year;
month = month+1;
unsigned int day   = epoch - days[year][month]+1;

unsigned int weekday  = (dayOfMonth += month < 3 ? year-- : year - 2, 23*month/9 + dayOfMonth + 4 + year/4- year/100 + year/400)%7;
``````

And to convert to Unix timestamp:

``````unsigned long epoch = (((year/4*(365*4+1)+days[year%4][month]+dayOfMonth)*24+hour)*60+minute)*60+second;
``````

Are there any library in Arduino that implement this? I would trade off reliability over size of the program.

I think that the two most used libraries are the Adafruit RTClib and the pjrc.com TimeLib. They both have functions to convert the epoch, and they both are reliable. But both lack the timezone and the DaylightSavingTime. I think you find the pjrc.com TimeLib just slightly more suitable to handle the epoch time (which is a 32-bit unsigned long defined as 'time_t').

• +1 for TimeLib. I use it all the time for unix timestamps. Commented May 24, 2017 at 17:29

There is a standard way of doing those conversions in C, which is through the functions defined in `<time.h>`. This API being standard, you can test it in your computer. Recent versions of the avr-libc support this: see time.h in avr-libc. These functions can handle local time if you provide a function implementing the DST rules: see `set_dst()`. Examples are provided for US and EU rules.

• Awesome, I didn't know that the 'time.h' with timezone and also DST were included with the Arduino. Thanks. To connect a RTC chip with that time system is sadly not nice. Every second a system_tick() should be called. I just stay with the pjrc.com TimeLib for now.
– Jot
Commented May 24, 2017 at 18:53
• @Jot That's not entirely correct. You can use a RTC to set the Arduino's internal clock, then call the internal clock for needed time info ... RTC in that case is merely a battery backed clock that is OCCASIONALLY used ... once per reboot and possibly every week or two for drift correction. Commented May 11, 2019 at 20:40

Here's an example to convert seconds (Unix time) to Date & Time using TimeLib.h:

``````#include <TimeLib.h>

unsigned long offset_days = 3;    // 3 days
unsigned long t_unix_date1, t_unix_date2;

void setup() {
Serial.begin(115200);
t_unix_date1 = 1564398600;
Serial.print("t_unix_date1: ");
Serial.println(t_unix_date1);
offset_days = offset_days * 86400;    // convert number of days to seconds
t_unix_date2 = 1564398600 + offset_days;
Serial.print("t_unix_date2: ");
Serial.println(t_unix_date2);
printf("Date1: %4d-%02d-%02d %02d:%02d:%02d\n", year(t_unix_date1), month(t_unix_date1), day(t_unix_date1), hour(t_unix_date1), minute(t_unix_date1), second(t_unix_date1));
printf("Date2: %4d-%02d-%02d %02d:%02d:%02d\n", year(t_unix_date2), month(t_unix_date2), day(t_unix_date2), hour(t_unix_date2), minute(t_unix_date2), second(t_unix_date2));
}

void loop() {

}
``````