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