5
5
6
6
основано на https://www.oryx-embedded.com/doc/date__time_8c_source.html
7
7
и https://stackoverflow.com/questions/7960318/math-to-convert-seconds-since-1970-into-date-and-vice-versa
8
+ и http://howardhinnant.github.io/date_algorithms.html#civil_from_days
8
9
9
10
10
11
https://alexgyver.ru/
11
12
MIT License
12
13
13
14
Версии:
14
15
v1.0 - релиз
16
+ v1.1 - оптимизация
15
17
*/
16
18
17
- #ifndef UnixTime_h
18
- #define UnixTime_h
19
+ #ifndef _UnixTime_h
20
+ #define _UnixTime_h
19
21
class UnixTime {
20
22
public:
21
23
// указать GMT
22
24
UnixTime (int8_t gmt) {
23
25
_gmt = gmt;
24
26
}
25
-
27
+
26
28
// получить unix stamp из установленной даты и времени
27
29
uint32_t getUnix () {
28
- int mdays[] = {0 , 31 , 59 , 90 , 120 , 151 , 181 , 212 , 243 , 273 , 304 , 334 };
29
- int yearB = year;
30
- yearB -= 1970 ;
31
- int minusYear = 0 ;
32
- if (month >= 3 ) {
33
- yearB++;
34
- minusYear = 1 ;
35
- }
36
- return ( ( (day - 1 + mdays[month - 1 ] + ( ( yearB + 1 ) >> 2 ) - ( ( yearB + 69 ) / 100 ) + ( ( yearB + 369 ) / 100 / 4 ) + 365 * ( yearB - minusYear )) * 24ul + hour - _gmt) * 60ul + minute ) * 60ul + second;
30
+ int8_t my = (month >= 3 ) ? 1 : 0 ;
31
+ uint16_t y = year + my - 1970 ;
32
+ uint16_t dm = 0 ;
33
+ for (int i = 0 ; i < month - 1 ; i++) dm += (i<7 )?((i==1 )?28 :((i&1 )?30 :31 )):((i&1 )?31 :30 );
34
+ return (((day-1 +dm+((y+1 )>>2 )-((y+69 )/100 )+((y+369 )/100 /4 )+365 *(y-my))*24ul +hour-_gmt)*60ul +minute)*60ul +second;
37
35
}
38
36
39
37
// конвертировать unix stamp дату и время (в переменные члены класса)
40
38
void getDateTime (uint32_t t) {
39
+ // http://howardhinnant.github.io/date_algorithms.html#civil_from_days
40
+ t += _gmt * 3600ul ;
41
+ second = t % 60ul ;
42
+ t /= 60ul ;
43
+ minute = t % 60ul ;
44
+ t /= 60ul ;
45
+ hour = t % 24ul ;
46
+ t /= 24ul ;
47
+ dayOfWeek = (t + 4 ) % 7 ;
48
+ if (!dayOfWeek) dayOfWeek = 7 ;
49
+ uint32_t z = t + 719468 ;
50
+ uint8_t era = z / 146097ul ;
51
+ uint16_t doe = z - era * 146097ul ;
52
+ uint16_t yoe = (doe - doe / 1460 + doe / 36524 - doe / 146096 ) / 365 ;
53
+ uint16_t y = yoe + era * 400 ;
54
+ uint16_t doy = doe - (yoe * 365 + yoe / 4 - yoe / 100 );
55
+ uint16_t mp = (doy * 5 + 2 ) / 153 ;
56
+ day = doy - (mp * 153 + 2 ) / 5 + 1 ;
57
+ month = mp + (mp < 10 ? 3 : -9 );
58
+ y += (month <= 2 );
59
+ year = y;
60
+ /*
61
+ //https://www.oryx-embedded.com/doc/date__time_8c_source.html
41
62
uint32_t a, b, c, d, e, f;
42
63
int h, j, k;
43
-
44
- t += _gmt * 3600 ;
64
+ t += _gmt * 3600ul;
45
65
second = t % 60ul;
46
66
t /= 60;
47
67
minute = t % 60ul;
48
68
t /= 60;
49
69
hour = t % 24ul;
50
70
t /= 24;
51
-
52
71
a = (uint32_t)((4ul * t + 102032) / 146097 + 15);
53
72
b = (uint32_t)(t + 2442113 + a - (a / 4));
54
73
c = (20 * b - 2442) / 7305;
55
74
d = b - 365 * c - (c / 4);
56
75
e = d * 1000 / 30601;
57
76
f = d - e * 30 - e * 601 / 1000;
58
-
59
- // январь и февраль как 13 и 14 месяцы
60
77
if (e <= 13) {
61
78
c -= 4716;
62
79
e -= 1;
63
80
} else {
64
81
c -= 4715;
65
82
e -= 13;
66
83
}
67
-
68
84
year = c;
69
85
month = e;
70
86
day = f;
71
-
72
87
if (e <= 2) {
73
88
e += 12;
74
89
c -= 1;
@@ -77,6 +92,7 @@ class UnixTime {
77
92
k = c % 100;
78
93
h = f + (26 * (e + 1) / 10) + k + (k / 4) + (5 * j) + (j / 4); // Уравнение Зеллера
79
94
dayOfWeek = ((h + 5) % 7) + 1;
95
+ */
80
96
}
81
97
82
98
// установка даты и времени (удобнее чем писать переменные вурчную)
@@ -101,4 +117,4 @@ class UnixTime {
101
117
private:
102
118
int8_t _gmt = 0 ;
103
119
};
104
- #endif
120
+ #endif
0 commit comments