Time Shield Library
C++ library for working with time
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Modules Pages
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
201 bool str_to_fts(string str, double &ts) {
203 if(!parse_iso8601(str, dt, tz)) return false;
204 ts = to_ftimestamp(dt) + (double)to_offset(tz);
205 return true;
206 }
207
212 long ts(string str) {
213 long v=0;
214 str_to_ts(str,v);
215 return v;
216 }
217
222 long ts_ms(string str) {
223 long v=0;
224 str_to_ts_ms(str,v);
225 return v;
226 }
227
232 double fts(string str) {
233 double v=0.0;
234 str_to_fts(str,v);
235 return v;
236 }
237
238 //--------------------------------------------------------------------------
239
248 int sec_of_day(string str) {
249 string result[];
250 const int k = StringSplit(str, ':', result);
251
252 if (k < 1 || k > 3)
253 return (int)SEC_PER_DAY;
254
255 int h = 0, m = 0, s = 0;
256
257 h = (int)StringToInteger(result[0]);
258 if (k > 1) m = (int)StringToInteger(result[1]);
259 if (k > 2) s = (int)StringToInteger(result[2]);
260
261 if (!is_valid_time(h, m, s)) return (int)SEC_PER_DAY;
262
263 return sec_of_day(h, m, s);
264 }
265
267
268}; // namespace time_shield
269
270#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.
Definition constants.hpp:76
TIME_SHIELD_CONSTEXPR const ts_t to_timestamp_ms(const T &date_time)
Alias for dt_to_timestamp_ms function.
TIME_SHIELD_CONSTEXPR ts_t ts(year_t year, int month, int day)
Alias for to_timestamp.
TIME_SHIELD_CONSTEXPR const T month_of_year(ts_t ts) noexcept
Get the month of the year.
constexpr fts_t to_ftimestamp(const T &date_time)
Alias for dt_to_ftimestamp.
constexpr const T sec_of_day(ts_t ts=ts()) noexcept
Get the second of the day.
constexpr T1 sec_to_ms(T2 ts) noexcept
Converts a timestamp from seconds to milliseconds.
TIME_SHIELD_CONSTEXPR const ts_t to_timestamp(const T &date_time)
Alias for dt_to_timestamp 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.
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.
const 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.
const TimeZoneStruct create_time_zone_struct(int hour, int min, bool is_positive=true)
Creates a TimeZoneStruct instance.
const ts_t ts() noexcept
Get the current UTC timestamp in seconds.
const ts_ms_t ts_ms() noexcept
Get the current UTC timestamp in milliseconds.
const 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.