Chuyển đổi sang và từ Unix Timestamp


8

Cách tốt nhất để chuyển đổi giữa ngày, giờ, phút, giây sang dấu thời gian Unix tính bằng mili giây trong Arduino là gì? Tôi cần có chuyển đổi này, vì tôi đang sử dụng RTC (ngày, giờ, phút, giây, v.v.) và truyền thông dấu thời gian Unix qua BLE

Tôi đã tìm thấy một số đoạn mã trực tuyến, nhưng chưa thử nghiệm rộng rãi.

  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;

Và để chuyển đổi sang dấu thời gian Unix:

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

Có thư viện nào trong Arduino thực hiện điều này không? Tôi sẽ đánh đổi độ tin cậy về kích thước của chương trình.

Câu trả lời:


7

Tôi nghĩ rằng hai thư viện được sử dụng nhiều nhất là Adaf nhung RTClibpjrc.com TimeLib . Cả hai đều có chức năng để chuyển đổi kỷ nguyên, và cả hai đều đáng tin cậy. Nhưng cả hai đều thiếu múi giờ và Ánh sáng ban ngày. Tôi nghĩ rằng bạn tìm thấy pjrc.com TimeLib chỉ phù hợp hơn một chút để xử lý thời gian kỷ nguyên (là một dấu không dài 32 bit được xác định là 'time_t').


+1 cho TimeLib. Tôi sử dụng nó tất cả các thời gian cho dấu thời gian unix.
Majenko

3

Có một cách tiêu chuẩn để thực hiện các chuyển đổi đó trong C, đó là thông qua các hàm được xác định trong <time.h>. API này là tiêu chuẩn, bạn có thể kiểm tra nó trong máy tính của mình. Các phiên bản gần đây của avr-libc hỗ trợ điều này: xem time.h trong avr-libc . Các hàm này có thể xử lý thời gian cục bộ nếu bạn cung cấp một hàm thực hiện các quy tắc DST: xem set_dst(). Ví dụ được cung cấp cho các quy tắc của Hoa Kỳ và EU.


Thật tuyệt vời, tôi không biết rằng 'time.h' với múi giờ và cả DST cũng được bao gồm trong Arduino. Cảm ơn. Để kết nối một con chip RTC với hệ thống thời gian đó thật đáng buồn. Mỗi giây một system_tick () sẽ được gọi. Bây giờ tôi chỉ ở lại với pjrc.com TimeLib.
Ghi

@Jot Điều đó không hoàn toàn chính xác. Bạn có thể sử dụng RTC để đặt đồng hồ bên trong của Arduino, sau đó gọi đồng hồ bên trong để biết thông tin về thời gian cần thiết ... RTC trong trường hợp đó chỉ là đồng hồ hỗ trợ pin được sử dụng OCCASIONALLY ... một lần mỗi lần khởi động lại và có thể mỗi tuần hoặc hai tuần để điều chỉnh trôi dạt.
Michael Sims

0

Dưới đây là một ví dụ để chuyển đổi giây (giờ Unix) thành Ngày & Giờ bằng 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() {



}

-6

Bất kỳ trình biên dịch c nửa nào cũng sẽ có một tập hợp các kiểu và thói quen liên quan đến thời gian để xử lý việc này. Tham khảo hướng dẫn sử dụng compiker của bạn để biết thêm chi tiết.

Btw, trái với sự khôn ngoan thông thường, bạn không cần vv để theo dõi thời gian. Bất kỳ bộ đếm thời gian cũ tốt hơn cộng với mã của bạn sẽ làm.


4
Hầu hết các Arduinos được tắt một bộ cộng hưởng gốm, và do đó không phù hợp với bất kỳ loại chấm công nào. Do đó, cần phải có RTC. Bộ đếm thời gian cũ tốt hơn của Cameron có thể thực hiện công việc chỉ khi bạn có Arduino đồng hồ pha lê.
Edgar Bonet

2
BTW, Tư vấn hướng dẫn sử dụng compiker của bạn không thực sự là một câu trả lời.
Edgar Bonet
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.