Time Shield Library
C++ library for working with time
Loading...
Searching...
No Matches
time_parser.mqh
Go to the documentation of this file.
1//+------------------------------------------------------------------+
2//| time_parser.mqh |
3//| Time Shield - MQL5 Time Parser |
4//| Copyright 2025, NewYaroslav |
5//| https://github.com/NewYaroslav/time-shield-cpp |
6//+------------------------------------------------------------------+
7#ifndef __TIME_SHIELD_TIME_PARSER_MQH__
8#define __TIME_SHIELD_TIME_PARSER_MQH__
9
18
19#property copyright "Copyright 2025, NewYaroslav"
20#property link "https://github.com/NewYaroslav/time-shield-cpp"
21#property strict
22
23#include <time_shield/enums.mqh>
29
30namespace time_shield {
31
35
39 int get_month_number(string month) {
40 if(StringLen(month)==0)
41 return 0;
42 string month_copy = month;
43 string tmp = "";
44 StringConcatenate(tmp,
45 StringToUpper(StringSubstr(month_copy,0,1)),
46 StringToLower(StringSubstr(month_copy,1)));
47 month_copy = tmp;
48 static const string short_names[] = {"Jan","Feb","Mar","Apr","May","Jun",
49 "Jul","Aug","Sep","Oct","Nov","Dec"};
50 static const string full_names[] = {"January","February","March","April","May","June",
51 "July","August","September","October","November","December"};
52 for(int i=0;i<MONTHS_PER_YEAR;++i)
53 {
54 if(month_copy==short_names[i] || month_copy==full_names[i])
55 return i+1;
56 }
57 return 0;
58 }
59
62 int month_of_year(string month) { return get_month_number(month); }
63
64//------------------------------------------------------------------------------
65
70 bool try_get_month_number(string month, int &value) {
71 int res = get_month_number(month);
72 if(res==0)
73 return false;
74 value = res;
75 return true;
76 }
77
80 bool get_month_number(string month, int &value) { return try_get_month_number(month,value); }
81
84 bool month_of_year(string month, int &value) { return try_get_month_number(month,value); }
85
86//------------------------------------------------------------------------------
87
94 bool parse_time_zone(string tz_str, TimeZoneStruct &tz)
95 {
96 if(StringLen(tz_str)==0 || tz_str=="Z")
97 {
98 tz.hour=0; tz.min=0; tz.is_positive=true; return true;
99 }
100 tz.is_positive = ((char)tz_str[0] =='+');
101 tz.hour = (int)StringToInteger(StringSubstr(tz_str,1,2));
102 tz.min = (int)StringToInteger(StringSubstr(tz_str,4,2));
103 return is_valid_time_zone(tz);
104 }
105
108 bool parse_tz(string tz_str, TimeZoneStruct &tz) { return parse_time_zone(tz_str, tz); }
109
110//------------------------------------------------------------------------------
111
117 bool parse_iso8601(string input_str, DateTimeStruct &dt, TimeZoneStruct &tz) {
119 tz = create_time_zone_struct(0,0);
120
121 string date_part=input_str;
122 string time_part="";
123 int posT=StringFind(input_str,"T");
124 if (posT<0) posT=StringFind(input_str," ");
125 if (posT>=0) {
126 date_part=StringSubstr(input_str,0,posT);
127 time_part=StringSubstr(input_str,posT+1);
128 }
129
130 string parts[];
131 int cnt = StringSplit(date_part,'-',parts);
132 if (cnt<3) {
133 cnt = StringSplit(date_part,'/',parts);
134 if (cnt<3) cnt = StringSplit(date_part,'.',parts);
135 }
136 if (cnt<3) return false;
137 dt.year=(long)StringToInteger(parts[0]);
138 dt.mon =(int)StringToInteger(parts[1]);
139 dt.day =(int)StringToInteger(parts[2]);
140
141 if (StringLen(time_part)>0) {
142 string tz_str = "";
143 int zpos = StringFind(time_part,"Z");
144 int ppos = StringFind(time_part,"+");
145 int npos = StringFind(time_part,"-");
146 int tzpos = -1;
147 if (zpos >= 0){ tzpos=zpos; tz_str=StringSubstr(time_part,zpos); }
148 else if(ppos >= 0){ tzpos=ppos; tz_str=StringSubstr(time_part,ppos); }
149 else if(npos > 0){ tzpos=npos; tz_str=StringSubstr(time_part,npos); }
150 if (tzpos >= 0) time_part=StringSubstr(time_part,0,tzpos);
151
152 string tparts[];
153 int tcnt=StringSplit(time_part,':',tparts);
154 if (tcnt < 2)
155 return is_valid_date_time(dt);
156 dt.hour = (int)StringToInteger(tparts[0]);
157 dt.min = (int)StringToInteger(tparts[1]);
158 if (tcnt >= 3) {
159 string sec_part=tparts[2];
160 int dot = StringFind(sec_part, ".");
161 if (dot >= 0) {
162 dt.sec = (int)StringToInteger(StringSubstr(sec_part,0,dot));
163 dt.ms = (int)StringToInteger(StringSubstr(sec_part,dot+1));
164 } else {
165 dt.sec = (int)StringToInteger(sec_part);
166 }
167 }
168 if (StringLen(tz_str)>0) {
169 if (!parse_time_zone(tz_str,tz)) return false;
170 }
171 }
172 return is_valid_date_time(dt);
173 }
174
179 bool str_to_ts(string str, long &ts) {
181 if(!parse_iso8601(str, dt, tz)) return false;
182 ts = to_timestamp(dt) + to_offset(tz);
183 return true;
184 }
185
190 bool str_to_ts_ms(string str, long &ts) {
192 if(!parse_iso8601(str, dt, tz)) return false;
194 return true;
195 }
196
200 bool is_workday(string str) {
201 long ts = 0;
202 if(!str_to_ts(str, ts))
203 return false;
204 return is_workday(ts);
205 }
206
209 bool workday(string str) { return is_workday(str); }
210
214 bool is_workday_ms(string str) {
215 long ts = 0;
216 if(!str_to_ts_ms(str, ts))
217 return false;
218 return is_workday_ms(ts);
219 }
220
223 bool workday_ms(string str) { return is_workday_ms(str); }
224
228 bool is_first_workday_of_month(string str) {
229 long ts = 0;
230 if(!str_to_ts(str, ts))
231 return false;
233 }
234
239 long ts = 0;
240 if(!str_to_ts_ms(str, ts))
241 return false;
243 }
244
249 bool is_within_first_workdays_of_month(string str, int count) {
250 long ts = 0;
251 if(!str_to_ts(str, ts))
252 return false;
254 }
255
260 bool is_within_first_workdays_of_month_ms(string str, int count) {
261 long ts = 0;
262 if(!str_to_ts_ms(str, ts))
263 return false;
265 }
266
270 bool is_last_workday_of_month(string str) {
271 long ts = 0;
272 if(!str_to_ts(str, ts))
273 return false;
275 }
276
281 long ts = 0;
282 if(!str_to_ts_ms(str, ts))
283 return false;
285 }
286
291 bool is_within_last_workdays_of_month(string str, int count) {
292 long ts = 0;
293 if(!str_to_ts(str, ts))
294 return false;
296 }
297
302 bool is_within_last_workdays_of_month_ms(string str, int count) {
303 long ts = 0;
304 if(!str_to_ts_ms(str, ts))
305 return false;
307 }
308
313 bool str_to_fts(string str, double &ts) {
315 if(!parse_iso8601(str, dt, tz)) return false;
316 ts = to_ftimestamp(dt) + (double)to_offset(tz);
317 return true;
318 }
319
324 long ts(string str) {
325 long v=0;
326 str_to_ts(str,v);
327 return v;
328 }
329
334 long ts_ms(string str) {
335 long v=0;
336 str_to_ts_ms(str,v);
337 return v;
338 }
339
344 double fts(string str) {
345 double v=0.0;
346 str_to_fts(str,v);
347 return v;
348 }
349
350 //--------------------------------------------------------------------------
351
360 int sec_of_day(string str) {
361 string result[];
362 const int k = StringSplit(str, ':', result);
363
364 if (k < 1 || k > 3)
365 return (int)SEC_PER_DAY;
366
367 int h = 0, m = 0, s = 0;
368
369 h = (int)StringToInteger(result[0]);
370 if (k > 1) m = (int)StringToInteger(result[1]);
371 if (k > 2) s = (int)StringToInteger(result[2]);
372
373 if (!is_valid_time(h, m, s)) return (int)SEC_PER_DAY;
374
375 return sec_of_day(h, m, s);
376 }
377
379
380}; // namespace time_shield
381
382#endif // __TIME_SHIELD_TIME_PARSER_MQH__
Header file with time-related constants.
Header for date and time structure and related functions (MQL5).
Header file with enumerations for weekdays, months, and other time-related categories.
const int64_t MONTHS_PER_YEAR
Months per year.
constexpr int64_t SEC_PER_DAY
Seconds per day.
TIME_SHIELD_CONSTEXPR bool is_first_workday_of_month_ms(ts_ms_t ts_ms) noexcept
Check whether a timestamp in milliseconds falls on the first workday of its month.
TIME_SHIELD_CONSTEXPR T month_of_year(ts_t ts) noexcept
Get the month of the year.
TIME_SHIELD_CONSTEXPR bool is_within_last_workdays_of_month_ms(ts_ms_t ts_ms, int count) noexcept
Check whether a timestamp in milliseconds falls within the last N workdays of its month.
TIME_SHIELD_CONSTEXPR bool is_within_first_workdays_of_month(year_t year, int month, int day, int count) noexcept
Check whether a date is within the first N workdays of its month.
TIME_SHIELD_CONSTEXPR bool workday(ts_t ts) noexcept
Alias for is_workday(ts_t).
constexpr T sec_of_day(ts_t ts=time_shield::ts()) noexcept
Get the second of the day.
TIME_SHIELD_CONSTEXPR bool is_within_first_workdays_of_month_ms(ts_ms_t ts_ms, int count) noexcept
Check whether a timestamp in milliseconds falls within the first N workdays of its month.
TIME_SHIELD_CONSTEXPR ts_t ts(year_t year, int month, int day)
Alias for to_timestamp.
TIME_SHIELD_CONSTEXPR bool is_last_workday_of_month(year_t year, int month, int day) noexcept
Check whether a date is the last workday of its month.
TIME_SHIELD_CONSTEXPR bool is_first_workday_of_month(year_t year, int month, int day) noexcept
Check whether a date is the first workday of its month.
TIME_SHIELD_CONSTEXPR bool is_last_workday_of_month_ms(ts_ms_t ts_ms) noexcept
Check whether a timestamp in milliseconds falls on the last workday of its month.
TIME_SHIELD_CONSTEXPR bool is_within_last_workdays_of_month(year_t year, int month, int day, int count) noexcept
Check whether a date is within the last N workdays of its month.
constexpr fts_t to_ftimestamp(const T &date_time)
Alias for dt_to_ftimestamp.
TIME_SHIELD_CONSTEXPR ts_t to_timestamp(const T &date_time)
Alias for dt_to_timestamp function.
TIME_SHIELD_CONSTEXPR bool workday_ms(ts_ms_t ts_ms) noexcept
Alias for is_workday(ts_ms_t).
constexpr T1 sec_to_ms(T2 ts) noexcept
Converts a timestamp from seconds to milliseconds.
TIME_SHIELD_CONSTEXPR ts_t to_timestamp_ms(const T &date_time)
Alias for dt_to_timestamp_ms function.
bool str_to_ts_ms(const std::string &str, ts_ms_t &ts)
Convert an ISO8601 string to a millisecond timestamp (ts_ms_t).
bool parse_iso8601(const std::string &input, DateTimeStruct &dt, TimeZoneStruct &tz)
Parse a date and time string in ISO8601 format.
bool try_get_month_number(const std::string &month, T &value)
Get the month number by name, with output parameter.
bool is_workday(const std::string &str)
Parse an ISO8601 string and check if it falls on a workday using second precision.
T get_month_number(const std::string &month)
Get the month number by name.
bool str_to_ts(const std::string &str, ts_t &ts)
Convert an ISO8601 string to a timestamp (ts_t).
bool str_to_fts(const std::string &str, fts_t &ts)
Convert an ISO8601 string to a floating-point timestamp (fts_t).
bool parse_time_zone(const std::string &tz_str, TimeZoneStruct &tz)
Parse a time zone string into a TimeZoneStruct.
bool parse_tz(const std::string &tz_str, TimeZoneStruct &tz)
Alias for parse_time_zone function.
bool is_workday_ms(const std::string &str)
Parse an ISO8601 string and check if it falls on a workday using millisecond precision.
tz_t to_offset(const TimeZoneStruct &tz)
Alias for time_zone_struct_to_offset function.
const DateTimeStruct create_date_time_struct(int64_t year, int mon=1, int day=1, int hour=0, int min=0, int sec=0, int ms=0)
Creates a DateTimeStruct instance.
TimeZoneStruct create_time_zone_struct(int hour, int min, bool is_positive=true)
Creates a TimeZoneStruct instance.
ts_t ts() noexcept
Get the current UTC timestamp in seconds.
ts_ms_t ts_ms() noexcept
Get the current UTC timestamp in milliseconds.
fts_t fts() noexcept
Get the current UTC timestamp in floating-point seconds.
TIME_SHIELD_CONSTEXPR bool is_valid_time_zone(T hour, T min) noexcept
Check if the time zone is valid.
TIME_SHIELD_CONSTEXPR bool is_valid_time(T1 hour, T1 min, T1 sec, T2 ms=0) noexcept
Checks the correctness of the specified time.
TIME_SHIELD_CONSTEXPR 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.
Main namespace for the Time Shield library.
Structure to represent date and time.
int ms
Millisecond component of time (0-999)
int hour
Hour component of time (0-23)
int64_t year
Year component of the date.
int day
Day component of the date (1-31).
int min
Minute component of time (0-59)
int mon
Month component of the date (1-12).
int sec
Second 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)
bool is_positive
True if the time zone offset is positive, false if negative.
Header with helper functions for converting between different time representations in MQL5.
Header for time zone structure and related functions (MQL5).
Header with validation functions for dates, times, and timestamps.