Cách tính toán thời gian năm tháng ngày giờ phút giây bằng bộ đếm thời gian của MCU

Dưới đây là một phần mã nguồn tham khảo:


1 if (localTime.bits.second++ >= 59) {
2     localTime.bits.second = 0;
3     if (localTime.bits.minute++ >= 59) {
4         localTime.bits.minute = 0;
5         if (localTime.bits.hour++ >= 23) {
6             localTime.bits.hour = 0;
7             localTime.bits.day++;
8             if (localTime.bits.month == 2) {
9                 int year = localTime.bits.year + 1990;
10                 if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
11                     if (localTime.bits.day > 29) {
12                         localTime.bits.day = 1;
13                         localTime.bits.month++;
14                     }
15                 } else {
16                     if (localTime.bits.day > 28) {
17                         localTime.bits.day = 1;
18                         localTime.bits.month++;
19                     }
20                 }
21             } else if (localTime.bits.month % 2) {
22                 if (localTime.bits.month == 9 || localTime.bits.month == 11) {
23                     if (localTime.bits.day > 30) {
24                         localTime.bits.day = 1;
25                         localTime.bits.month++;
26                     }
27                 } else {
28                     if (localTime.bits.day > 31) {
29                         localTime.bits.day = 1;
30                         localTime.bits.month++;
31                     }
32                 }
33             } else {
34                 if (localTime.bits.month == 4 || localTime.bits.month == 6) {
35                     if (localTime.bits.day > 30) {
36                         localTime.bits.day = 1;
37                         localTime.bits.month++;
38                     }
39                 } else {
40                     if (localTime.bits.day > 31) {
41                         localTime.bits.day = 1;
42                         localTime.bits.month++;
43                         if (localTime.bits.month > 12) {
44                             localTime.bits.month = 1;
45                             if (localTime.bits.year++ > 62) {
46                                 localTime.bits.year = 9;
47                             }
48                         }
49                     }
50                 }
51             }
52         }
53     }
54 }

Mã trên nên được thực thi trong hàm ngắt chu kỳ thời gian.

Nếu muốn chuyển đổi thành số giây sử dụng giá trị RTC:


1 static posix_time_t update_sntp_from_local_timer(void) {
2     struct tm timestamp;
3     time_t t2 = 0;
4     //0 là tháng đầu tiên, 1 là tháng thứ hai, v.v...
5     timestamp.tm_mon = localTimestamp.bxi_timestamp.bits.month - 1;
6     timestamp.tm_mday = localTimestamp.bxi_timestamp.bits.day;    //ngày trong tháng
7     timestamp.tm_year = localTimestamp.year - 1900; //bắt đầu từ năm 1900, \
8                                                     ví dụ: 1900-1970 = 2208988800 giây
9     timestamp.tm_hour = localTimestamp.bxi_timestamp.bits.hour;
10    timestamp.tm_min = localTimestamp.bxi_timestamp.bits.minute;
11    timestamp.tm_sec = localTimestamp.bxi_timestamp.bits.second;
12    timestamp.tm_yday = 0;        //ngày trong năm
13    timestamp.tm_isdst = 0;
14    t2 = mktime(&timestamp);
15    return t2;
16}

Thẻ: MCU timer Time Calculation RTC

Đăng vào ngày 30 tháng 9 lúc 10:00