Konversi ke dan dari Unix Timestamp

8

Apa cara terbaik untuk mengkonversi antara tanggal, jam, menit, detik ke cap waktu Unix dalam milidetik di Arduino? Saya perlu memiliki konversi ini, karena saya menggunakan RTC (tanggal, jam, menit, detik, dll) dan mengkomunikasikan stempel waktu Unix melalui BLE

Saya menemukan beberapa potongan kode online, tetapi belum mengujinya secara ekstensif.

  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;

Dan untuk mengkonversi ke cap waktu Unix:

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

Apakah ada perpustakaan di Arduino yang mengimplementasikan ini? Saya akan menukar keandalan dengan ukuran program.

Dzung Nguyen
sumber

Jawaban:

7

Saya pikir dua perpustakaan yang paling banyak digunakan adalah Adafruit RTClib dan pjrc.com TimeLib . Keduanya memiliki fungsi untuk mengubah zaman, dan keduanya dapat diandalkan. Tetapi keduanya tidak memiliki zona waktu dan DaylightSavingTime. Saya pikir Anda menemukan TimeLib pjrc.com hanya sedikit lebih cocok untuk menangani waktu zaman (yang merupakan 32-bit unsigned lama didefinisikan sebagai 'time_t').

Mencatat
sumber
+1 untuk TimeLib. Saya menggunakannya sepanjang waktu untuk cap waktu unix.
Majenko
3

Ada cara standar untuk melakukan konversi di C, yaitu melalui fungsi yang didefinisikan dalam <time.h>. API ini menjadi standar, Anda dapat mengujinya di komputer Anda. Versi terbaru dari avr-libc mendukung ini: lihat time.h di avr-libc . Fungsi-fungsi ini dapat menangani waktu setempat jika Anda menyediakan fungsi yang menerapkan aturan DST: lihat set_dst(). Contoh disediakan untuk aturan AS dan UE.

Edgar Bonet
sumber
Luar biasa, saya tidak tahu bahwa 'time.h' dengan zona waktu dan juga DST disertakan dengan Arduino. Terima kasih. Untuk menghubungkan chip RTC dengan sistem waktu itu sayangnya tidak baik. Setiap detik system_tick () harus dipanggil. Saya hanya tetap dengan TimeLib pjrc.com untuk saat ini.
Jot
@ Jot Itu tidak sepenuhnya benar. Anda dapat menggunakan RTC untuk menyetel jam internal Arduino, lalu memanggil jam internal untuk info waktu yang diperlukan ... RTC dalam kasus itu hanyalah jam yang didukung baterai yang SEKALI-KALI digunakan ... sekali per reboot dan mungkin setiap minggu atau dua untuk koreksi drift.
Michael Sims
0

Berikut ini contoh untuk mengonversi detik (waktu Unix) ke Tanggal & Waktu menggunakan 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() {



}
Ivan
sumber
-6

Setengah kompiler c yang layak akan memiliki serangkaian tipe dan rutinitas terkait waktu untuk menangani hal ini. Konsultasikan dengan manual compiker Anda untuk lebih spesifik.

Btw, bertentangan dengan kebijaksanaan konvensional, Anda tidak perlu dll untuk melacak waktu. Penghitung waktu lama yang lebih baik plus kode Anda akan berhasil.

dannyf
sumber
4
Sebagian besar Arduino memiliki resonator keramik, dan karenanya tidak cocok untuk segala jenis ketepatan waktu. Dengan demikian kebutuhan akan RTC. "Timer lama yang lebih baik" hanya dapat melakukan pekerjaan jika Anda memiliki Arduino yang memiliki jam kristal.
Edgar Bonet
2
BTW, "Konsultasikan manual kompiker Anda" sebenarnya bukan jawaban.
Edgar Bonet