MQL5Book/Scripts/p4/ConversionTimeStruct.mq5

132 lines
4.5 KiB
MQL5
Raw Permalink Normal View History

2025-05-30 16:09:41 +02:00
//+------------------------------------------------------------------+
//| ConversionTimeStruct.mq5 |
//| Copyright 2021, MetaQuotes Ltd. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#include "..\..\Include\DateTime.mqh"
#define PRT(A) Print(#A, "=", (A))
//+------------------------------------------------------------------+
//| ArrayInitialize overload for MqlDateTime |
//+------------------------------------------------------------------+
int ArrayInitialize(MqlDateTime &mdt[], MqlDateTime &init)
{
const int n = ArraySize(mdt);
for(int i = 0; i < n; ++i)
{
mdt[i] = init;
}
return n;
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
Print("*** TimeToStruct ***");
// fill array with test cases
datetime time[] =
{
D'2021.01.28 23:00:15', // correct datetime
D'3000.12.31 23:59:59', // last datetime
LONG_MAX // invalid value: will raise ERR_INVALID_DATETIME (4010) error
};
// calculate array size at compile time
const int n = sizeof(time) / sizeof(datetime);
MqlDateTime null = {};
MqlDateTime mdt[];
// allocate array of structs for results
ArrayResize(mdt, n);
// call our overload
ArrayInitialize(mdt, null);
// run test cases
for(int i = 0; i < n; ++i)
{
PRT(time[i]); // output original data
if(!TimeToStruct(time[i], mdt[i])) // on error output its code
{
Print("error: ", _LastError);
mdt[i].year = _LastError;
}
}
// show results in the log
ArrayPrint(mdt);
// now utilize DateTime helper class from DateTime.mqh
// first extract day of week from the given datetime
PRT(EnumToString(TimeDayOfWeek(time[0])));
// then extract year, month, day from the same value
PRT(_TimeYear());
PRT(_TimeMonth());
PRT(_TimeDay());
/* will output:
time[i]=2021.01.28 23:00:15
time[i]=3000.12.31 23:59:59
time[i]=wrong datetime
error: 4010
[year] [mon] [day] [hour] [min] [sec] [day_of_week] [day_of_year]
[0] 2021 1 28 23 0 15 4 27
[1] 3000 12 31 23 59 59 3 364
[2] 4010 0 0 0 0 0 0 0
EnumToString(DateTime::_DateTime.assign(time[0]).__TimeDayOfWeek())=THURSDAY
DateTime::_DateTime.__TimeYear()=2021
DateTime::_DateTime.__TimeMonth()=1
DateTime::_DateTime.__TimeDay()=28
*/
Print("*** StructToTime ***");
// fill test array of input structs
MqlDateTime parts[] =
{
{0, 0, 0, 0, 0, 0, 0, 0},
{100, 0, 0, 0, 0, 0, 0, 0},
{2021, 2, 30, 0, 0, 0, 0, 0},
{2021, 13, -5, 0, 0, 0, 0, 0},
{2021, 50, 100, 0, 0, 0, 0, 0},
{2021, 10, 20, 15, 30, 155, 0, 0},
{2021, 10, 20, 15, 30, 55, 0, 0},
};
ArrayPrint(parts);
Print("");
// convert all elements in the loop
for(int i = 0; i < sizeof(parts) / sizeof(MqlDateTime); ++i)
{
ResetLastError();
datetime result = StructToTime(parts[i]);
Print("[", i, "] ", (long)result, " ", result, " ", _LastError);
}
/* will output:
[year] [mon] [day] [hour] [min] [sec] [day_of_week] [day_of_year]
[0] 0 0 0 0 0 0 0 0
[1] 100 0 0 0 0 0 0 0
[2] 2021 2 30 0 0 0 0 0
[3] 2021 13 -5 0 0 0 0 0
[4] 2021 50 100 0 0 0 0 0
[5] 2021 10 20 15 30 155 0 0
[6] 2021 10 20 15 30 55 0 0
[0] -1 wrong datetime 4010
[1] 946684800 2000.01.01 00:00:00 4010
[2] 1614643200 2021.03.02 00:00:00 0
[3] 1638316800 2021.12.01 00:00:00 4010
[4] 1640908800 2021.12.31 00:00:00 4010
[5] 1634743859 2021.10.20 15:30:59 4010
[6] 1634743855 2021.10.20 15:30:55 0
*/
}
//+------------------------------------------------------------------+