Time Shield Library
C++ library for working with time
Loading...
Searching...
No Matches
validation.mqh
Go to the documentation of this file.
1//+------------------------------------------------------------------+
2//| validation.mqh |
3//| Time Shield - MQL5 Validation Functions |
4//| Copyright 2025, NewYaroslav |
5//| https://github.com/NewYaroslav/time-shield-cpp |
6//+------------------------------------------------------------------+
7#ifndef __TIME_SHIELD_VALIDATION_MQH__
8#define __TIME_SHIELD_VALIDATION_MQH__
9
16
17#property copyright "Copyright 2025, NewYaroslav"
18#property link "https://github.com/NewYaroslav/time-shield-cpp"
19#property strict
20
21namespace time_shield {
22
26
30 bool is_leap_year_date(const long year) {
31 return ((year & 3) == 0 && ((year % 25) != 0 || (year & 15) == 0));
32 }
33
36 bool check_leap_year(const long year) { return is_leap_year_date(year); }
37
40 bool leap_year(const long year) { return is_leap_year_date(year); }
41
42 //----------------------------------------------------------------------
43
47 bool is_leap_year_ts(const long ts) {
48 const long BIAS_292277022000 = 9223371890843040000LL;
49 const long BIAS_2000 = 946684800LL;
50
51 long y = MAX_YEAR;
52 long secs = -((ts - BIAS_2000) - BIAS_292277022000);
53
54 long n_400_years = secs / SEC_PER_400_YEARS;
55 secs -= n_400_years * SEC_PER_400_YEARS;
56 y -= n_400_years * 400;
57
58 long n_100_years = secs / SEC_PER_100_YEARS;
59 secs -= n_100_years * SEC_PER_100_YEARS;
60 y -= n_100_years * 100;
61
62 long n_4_years = secs / SEC_PER_4_YEARS;
63 secs -= n_4_years * SEC_PER_4_YEARS;
64 y -= n_4_years * 4;
65
66 long n_1_years = secs / SEC_PER_YEAR;
67 secs -= n_1_years * SEC_PER_YEAR;
68 y -= n_1_years;
69
70 y = secs == 0 ? y : y - 1;
71 return is_leap_year_date(y);
72 }
73
76 bool leap_year_ts(const long ts) { return is_leap_year_ts(ts); }
77
80 bool check_leap_year_ts(const long ts) { return is_leap_year_ts(ts); }
81
84 bool is_leap_year(const long ts) { return is_leap_year_ts(ts); }
85
86 //----------------------------------------------------------------------
87
92 bool is_valid_time_zone(const int hour, const int min) {
93 if (hour < 0 || hour > 23) return false;
94 if (min < 0 || min > 59) return false;
95 return true;
96 }
97
100 bool is_valid_tz(const int hour, const int min) {
101 return is_valid_time_zone(hour, min);
102 }
103
108 return is_valid_time_zone(time_zone.hour, time_zone.min);
109 }
110
113 bool is_valid_time_zone(const TimeZoneStruct &time_zone) {
114 return is_valid_time_zone_offset(time_zone);
115 }
116
119 bool is_valid_tz(const TimeZoneStruct &time_zone) {
120 return is_valid_time_zone_offset(time_zone);
121 }
122
123 //----------------------------------------------------------------------
124
131 bool is_valid_time(const int hour, const int min, const int sec, const int ms = 0) {
132 if (hour < 0 || hour > 23) return false;
133 if (min < 0 || min > 59) return false;
134 if (sec < 0 || sec > 59) return false;
135 if (ms < 0 || ms > 999) return false;
136 return true;
137 }
138
142 bool is_valid_time(const TimeStruct &time) {
143 return is_valid_time(time.hour, time.min, time.sec, time.ms);
144 }
145
151 bool is_valid_date(const long year, const int month, const int day) {
152 if (day > 31 && year <= 31)
153 return is_valid_date((long)day, month, (int)year);
154 if (year > MAX_YEAR) return false;
155 if (month < 1 || month > 12) return false;
156 if (day < 1 || day > 31) return false;
157 if (month == FEB) {
158 bool leap = is_leap_year_date(year);
159 if (leap && day > 29) return false;
160 if (!leap && day > 28) return false;
161 } else {
162 switch(month) {
163 case 4:
164 case 6:
165 case 9:
166 case 11:
167 if (day > 30) return false;
168 break;
169 default:
170 break;
171 }
172 }
173 return true;
174 }
175
179 bool is_valid_date(const DateStruct &date) {
180 return is_valid_date(date.year, date.mon, date.day);
181 }
182
193 const long year,
194 const int month,
195 const int day,
196 const int hour = 0,
197 const int min = 0,
198 const int sec = 0,
199 const int ms = 0) {
200 if (!is_valid_date(year, month, day)) return false;
201 if (!is_valid_time(hour, min, sec, ms)) return false;
202 return true;
203 }
204
208 bool is_valid_date_time(const DateTimeStruct &date_time) {
209 if (!is_valid_date(date_time)) return false;
210 if (!is_valid_time(date_time)) return false;
211 return true;
212 }
213
214 //----------------------------------------------------------------------
215
219 bool is_day_off(const long ts) {
220 int wd = (int)((ts / SEC_PER_DAY + THU) % DAYS_PER_WEEK);
221 return (wd == SUN || wd == SAT);
222 }
223
226 bool is_weekend(const long ts) { return is_day_off(ts); }
227
231 bool is_day_off_unix_day(const long unix_day) {
232 int wd = (int)((unix_day + THU) % DAYS_PER_WEEK);
233 return (wd == SUN || wd == SAT);
234 }
235
238 bool is_weekend_unix_day(const long unix_day) {
240 }
241
243
244}; // namespace time_shield
245
246#endif // __TIME_SHIELD_VALIDATION_MQH__
constexpr int64_t DAYS_PER_WEEK
Days per week.
constexpr int64_t SEC_PER_YEAR
Seconds per year (365 days)
Definition constants.hpp:77
constexpr int64_t SEC_PER_100_YEARS
Seconds per 100 years.
Definition constants.hpp:82
constexpr int64_t MAX_YEAR
Maximum representable year.
constexpr int64_t SEC_PER_400_YEARS
Seconds per 400 years.
Definition constants.hpp:83
constexpr int64_t SEC_PER_DAY
Seconds per day.
Definition constants.hpp:76
constexpr int64_t SEC_PER_4_YEARS
Seconds per 4 years.
Definition constants.hpp:80
TIME_SHIELD_CONSTEXPR const ts_t ts(T1 year, T2 month, T2 day, T2 hour=0, T2 min=0, T2 sec=0)
Alias for to_timestamp function.
constexpr const T unix_day(ts_t ts=ts()) noexcept
Alias for get_unix_day function.
TIME_SHIELD_CONSTEXPR const T year(ts_t ts=ts())
Alias for get_year function.
@ FEB
February.
Definition enums.hpp:106
@ SUN
Sunday.
Definition enums.hpp:42
@ SAT
Saturday.
Definition enums.hpp:48
@ THU
Thursday.
Definition enums.hpp:46
TIME_SHIELD_CONSTEXPR const bool is_valid_time_zone_offset(const T &time_zone) noexcept
Check if the time zone is valid.
constexpr const bool is_leap_year_date(T year) noexcept
Checks if the given year is a leap year.
TIME_SHIELD_CONSTEXPR bool is_valid_tz(T hour, T min)
Alias for is_valid_time_zone function.
TIME_SHIELD_CONSTEXPR const bool is_day_off(ts_t ts) noexcept
Check if a given timestamp corresponds to a weekend day (Saturday or Sunday).
constexpr const bool check_leap_year(T year) noexcept
Alias for is_leap_year_date function.
TIME_SHIELD_CONSTEXPR const bool is_valid_date(T1 year, T2 month, T2 day) noexcept
Checks the correctness of the specified date.
TIME_SHIELD_CONSTEXPR const bool leap_year_ts(ts_t ts)
Alias for is_leap_year_ts function.
TIME_SHIELD_CONSTEXPR const bool is_valid_time(T1 hour, T1 min, T1 sec, T2 ms=0) noexcept
Checks the correctness of the specified time.
TIME_SHIELD_CONSTEXPR const bool is_valid_date_time(T1 year, T2 month, T2 day, T2 hour=0, T2 min=0, T2 sec=0, T3 ms=0) noexcept
Checks the correctness of a date and time.
TIME_SHIELD_CONSTEXPR const bool check_leap_year_ts(ts_t ts)
Alias for is_leap_year_ts function.
constexpr const bool leap_year(T year) noexcept
Alias for is_leap_year_date function.
TIME_SHIELD_CONSTEXPR const bool is_valid_time_zone(T hour, T min) noexcept
Check if the time zone is valid.
TIME_SHIELD_CONSTEXPR const bool is_leap_year(ts_t ts)
Alias for is_leap_year_ts function.
TIME_SHIELD_CONSTEXPR const bool is_leap_year_ts(ts_t ts)
Checks if the given year is a leap year.
TIME_SHIELD_CONSTEXPR const bool is_weekend(ts_t ts) noexcept
Alias for is_day_off function.
TIME_SHIELD_CONSTEXPR bool is_weekend_unix_day(T unix_day) noexcept
Alias for is_day_off_unix_day function.
TIME_SHIELD_CONSTEXPR bool is_day_off_unix_day(T unix_day) noexcept
Check if a given day (since Unix epoch) corresponds to a weekend day (Saturday or Sunday)....
Main namespace for the Time Shield library.
Structure to represent a date.
int32_t mon
Month component of the date (1-12).
int32_t day
Day component of the date (1-31).
int64_t year
Year component of the date.
Structure to represent date and time.
Structure to represent time.
int16_t ms
Millisecond component of time (0-999)
int16_t hour
Hour component of time (0-23)
int16_t sec
Second component of time (0-59)
int16_t min
Minute component of time (0-59)
Structure to represent time zone information.
int hour
Hour component of time (0-23)
int min
Minute component of time (0-59)