Ten typ służy do przechowywania daty i czasu w postaci ilości sekund od 1 stycznia 1970 roku od godziny 00:00:00. Zmienne tego typu mogą być reprezentowane ciągiem znaków składające się z 6 części: rok, miesiąc, dzień, godzina, minuta, sekunda. Najpierw należy zapisać symbol D, potem w pojedynczych cudzysłowach zapisać ciąg znaków opisujących datę i czas (kod 1).
#property strict
datetime NY = D'2016.01.01 00:00'; // data nowego roku 2016
datetime date_1 = D'2015.08.20 15:10:53'; // rok.miesiąc.dzień godzina:minuta:sekunda
datetime date_2 = D'20.08.2015 15:10:53'; // tożsame z D'2015.08.20 15:10:53';
datetime date_3 = D'21.09.2015 15'; // tożsame z D'2015.09.21 15:00:00'
datetime date_4 = D'22.10.2015'; // tożsame z D'2015.10.22 00:00:00'
void OnStart()
{
Print("NY = " , NY);
Print("date_1 = " , date_1);
Print("date_2 = " , date_2);
Print("date_3 = " , date_3);
Print("date_4 = " , date_4);
}
Po uruchomieniu tego skryptu w logach terminala zobaczymy informacje jak na poniższym obrazku.
Rys. 1. Przykład stosowania typu datetime.
W pamięci komputera datetime zajmuje 8 bajtów (64 bitów) i może przechowywać wartość czasu od 1 stycznia 1970 do 31 grudnia 3000.
Czas w MQL4 można także określić za pomocą ilości sekund, które minęły od 01-01-1970, 00:00:00. Zademonstruję to na poniższym przykładzie.
#property strict
ulong seconds_1 = 15;
ulong seconds_2 = 1000000000;
datetime date_1;
datetime date_2;
void OnStart()
{
date_1 = (datetime)seconds_1; // konwersja ulong do datetime
date_2 = (datetime)seconds_2; // konwersja ulong do datetime
Print(seconds_1 , " sekund po 1970.01.01 00:00:00 to będzie " , date_1);
Print(seconds_2 , " sekund po 1970.01.01 00:00:00 to będzie " , date_2);
}
Tu jak zwykle na samym początku zapisano dyrektywę #property z komendą strict, dzięki czemu będziemy pracować na nowym kompilatorze. Utworzono dwie zmienne typu ulong, każdej z nich przypisano wartości liczbowe, i dwie zmienne typu datetime. Następnie, w ciele głównej funkcji skryptu OnStart() dokonano konwersji wartości typu ulong do typu datetime (kod 3).
date_1 = (datetime)seconds_1; // konwersja ulong do datetime
date_2 = (datetime)seconds_2; // konwersja ulong do datetime
W pierwszej instrukcji widzimy, że zanim zmiennej date_1 mającej typ datetime zostanie przypisana liczba 15 typu ulong (seconds_1) ta liczba najpierw ulegnie konwersji do typu datetime, a dopiero potem przypisana date_1. W drugiej instrukcji zachodzi ten sam proces konwersji liczby 1000000000 z ulong do datetime.
Na poniższym rysunku widać wynik działania tego skryptu.
Rys. 2. Przykład konwersji ulong do datetime.
Z ciekawości obliczmy ilość sekund jaka się mieści między 1970.01.01 00:00:00 a 3000.12.31 00:00:00.
#property strict
datetime Begin = D'1970.01.01';
datetime End = D'3000.12.31';
ulong Between;
void OnStart()
{
Between = ulong(End - Begin); // konwersja datetime do ulong
Print("Między ", Begin, " a ", End, " mieści się ", Between, " sekund.");
}
W tym kodzie na odwrót, typ datetime konwertujemy na ulong. W ciele OnStart() najpierw obliczamy różnicę zmiennych End i Begin, które mają typ datetime. Następnie wartość tej różnicy konwertujemy na typ ulong i przypisujemy ją zmiennej Between.
Rys. 3. Przykład konwersji datetime do ulong.