PatchworkOS
Loading...
Searching...
No Matches
time_utils.c
Go to the documentation of this file.
1#include "time_utils.h"
2
4
6{
7 // TODO: Load this from a file or something
9 .secondsOffset = 3600 // Swedish time zone for now
10 };
11}
12
14{
15 return &timeZone;
16}
17
18// Il be honest i have no clue if this is correct *shrug*
19
20static const int32_t daysInMonth[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
21static const int32_t cumulativeDays[] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};
22static const int32_t cumulativeDaysLeap[] = {0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335};
23
25{
26 return (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));
27}
28
30{
31 if (month == 1 && _time_is_leap_year(year))
32 {
33 return 29;
34 }
35 return daysInMonth[month];
36}
37
38void _time_normalize(struct tm* timePtr)
39{
40 int32_t carry = timePtr->tm_sec / 60;
41 timePtr->tm_sec %= 60;
42 if (timePtr->tm_sec < 0)
43 {
44 timePtr->tm_sec += 60;
45 carry--;
46 }
47
48 timePtr->tm_min += carry;
49 carry = timePtr->tm_min / 60;
50 timePtr->tm_min %= 60;
51 if (timePtr->tm_min < 0)
52 {
53 timePtr->tm_min += 60;
54 carry--;
55 }
56
57 timePtr->tm_hour += carry;
58 carry = timePtr->tm_hour / 24;
59 timePtr->tm_hour %= 24;
60 if (timePtr->tm_hour < 0)
61 {
62 timePtr->tm_hour += 24;
63 carry--;
64 }
65
66 timePtr->tm_year += timePtr->tm_mon / 12;
67 timePtr->tm_mon %= 12;
68 if (timePtr->tm_mon < 0)
69 {
70 timePtr->tm_mon += 12;
71 timePtr->tm_year--;
72 }
73
74 while (1)
75 {
76 int32_t maxDays = _time_days_in_month(timePtr->tm_mon, timePtr->tm_year + 1900);
77
78 if (timePtr->tm_mday > maxDays)
79 {
80 timePtr->tm_mday -= maxDays;
81 timePtr->tm_mon++;
82 if (timePtr->tm_mon >= 12)
83 {
84 timePtr->tm_mon = 0;
85 timePtr->tm_year++;
86 }
87 }
88 else if (timePtr->tm_mday < 1)
89 {
90 timePtr->tm_mon--;
91 if (timePtr->tm_mon < 0)
92 {
93 timePtr->tm_mon = 11;
94 timePtr->tm_year--;
95 }
96 timePtr->tm_mday += _time_days_in_month(timePtr->tm_mon, timePtr->tm_year + 1900);
97 }
98 else
99 {
100 break;
101 }
102 }
103}
104
105void _time_day_of_week(struct tm* timePtr)
106{
107 int32_t y = timePtr->tm_year + 1900;
108 int32_t m = timePtr->tm_mon + 1;
109 int32_t d = timePtr->tm_mday;
110
111 if (m < 3)
112 {
113 m += 12;
114 y--;
115 }
116
117 int32_t k = y % 100;
118 int32_t j = y / 100;
119 int32_t h = (d + 13 * (m + 1) / 5 + k + k / 4 + j / 4 - 2 * j) % 7;
120
121 timePtr->tm_wday = (h + 6) % 7;
122}
123
124void _time_day_of_year(struct tm* timePtr)
125{
126 int32_t month = timePtr->tm_mon;
127 int32_t day = timePtr->tm_mday - 1;
128 int32_t year = timePtr->tm_year + 1900;
129
130 if (_time_is_leap_year(year))
131 {
132 timePtr->tm_yday = cumulativeDaysLeap[month] + day;
133 }
134 else
135 {
136 timePtr->tm_yday = cumulativeDays[month] + day;
137 }
138}
int64_t y
Definition main.c:153
__INT32_TYPE__ int32_t
Definition stdint.h:14
int64_t secondsOffset
Definition time_utils.h:10
Definition time.h:21
int tm_mon
Definition time.h:26
int tm_year
Definition time.h:27
int tm_hour
Definition time.h:24
int tm_sec
Definition time.h:22
int tm_yday
Definition time.h:29
int tm_mday
Definition time.h:25
int tm_min
Definition time.h:23
int tm_wday
Definition time.h:28
static const int32_t daysInMonth[]
Definition time_utils.c:20
bool _time_is_leap_year(int32_t year)
Definition time_utils.c:24
_time_zone_t * _time_zone(void)
Definition time_utils.c:13
void _time_normalize(struct tm *timePtr)
Definition time_utils.c:38
void _time_day_of_year(struct tm *timePtr)
Definition time_utils.c:124
void _time_day_of_week(struct tm *timePtr)
Definition time_utils.c:105
static const int32_t cumulativeDays[]
Definition time_utils.c:21
int32_t _time_days_in_month(int32_t month, int32_t year)
Definition time_utils.c:29
_time_zone_t timeZone
Definition time_utils.c:3
void _time_zone_init(void)
Definition time_utils.c:5
static const int32_t cumulativeDaysLeap[]
Definition time_utils.c:22