8

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.

7

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. – Majenko May 24 '17 at 17:29
3

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 May 24 '17 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. – Michael Sims May 11 at 20:40
0

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() {



}
-5

Any half decent c compiler would have a set of time related types and routines to deal with this. Consult your compiker manual for more specifics.

Btw, contrary to conventional wisdom, you don't need an etc to keep track of time. Any good older timer plus your code will do.

  • 4
    Most Arduinos are clocked off a ceramic resonator, and are thus ill suited for any kind of timekeeping. Thus the need for an RTC. The “good older timer” can do the job only if you have a crystal-clocked Arduino. – Edgar Bonet May 24 '17 at 20:09
  • 2
    BTW, “Consult your compiker manual” is not really an answer. – Edgar Bonet May 24 '17 at 20:11

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.