{{tag>mql4 mql5 サマータイム}}
====== 【MQL4 / MQL5】日付がサマータイムかどうかを判定する ======
{{INLINETOC}}
===== サマータイムの判定関数 =====
MQL4 / MQL5 で日付がサマータイムかどうかを判定する関数を紹介する。\\
ニューヨーク、ロンドン、シドニーのサマータイムを判定する。\\
''MqlDateTime'' 型の引数を受け取り、その日付がサマータイム期間中なら ''true'' を、サマータイム期間外なら ''false'' を返す。
==== ニューヨークのサマータイム ====
2007 年以降:3 月第 2 日曜日から 11 月第 1 日曜日までが夏時間\\
2006 年まで:4 月第 1 日曜日から 10 月最終日曜日までが夏時間
bool IsNewYorkDST(MqlDateTime &dt)
{
int today = (dt.year * 10000) + (dt.mon * 100) + dt.day;
int start = 0;
int end = 0;
if(dt.year >= 2007)
{
MqlDateTime dt0314;
TimeToStruct((datetime)(IntegerToString(dt.year) + ".3.14"), dt0314);
MqlDateTime dt1107;
TimeToStruct((datetime)(IntegerToString(dt.year) + ".11.7"), dt1107);
start = (dt.year * 10000) + (3 * 100) + (14 - dt0314.day_of_week);
end = (dt.year * 10000) + (11 * 100) + (7 - dt1107.day_of_week);
}
else
{
MqlDateTime dt0407;
TimeToStruct((datetime)(IntegerToString(dt.year) + ".4.7"), dt0407);
MqlDateTime dt1031;
TimeToStruct((datetime)(IntegerToString(dt.year) + ".10.31"), dt1031);
start = (dt.year * 10000) + (4 * 100) + (7 - dt0407.day_of_week);
end = (dt.year * 10000) + (10 * 100) + (31 - dt1031.day_of_week);
}
return(today >= start && today < end);
}
==== ロンドンのサマータイム ====
3 月最終日曜日から 10 月最終日曜日までが夏時間
bool IsLondonDST(MqlDateTime &dt)
{
int today = (dt.year * 10000) + (dt.mon * 100) + dt.day;
int start = 0;
int end = 0;
MqlDateTime dt0331;
TimeToStruct((datetime)(IntegerToString(dt.year) + ".3.31"), dt0331);
MqlDateTime dt1031;
TimeToStruct((datetime)(IntegerToString(dt.year) + ".10.31"), dt1031);
start = (dt.year * 10000) + (3 * 100) + (31 - dt0331.day_of_week);
end = (dt.year * 10000) + (10 * 100) + (31 - dt1031.day_of_week);
return(today >= start && today < end);
}
==== シドニーのサマータイム ====
10 月第 1 日曜日から 4 月第 1 日曜日までが夏時間
bool IsSydneyDST(MqlDateTime &dt)
{
int today = (dt.year * 10000) + (dt.mon * 100) + dt.day;
int start = 0;
int end = 0;
MqlDateTime dt1007;
TimeToStruct((datetime)(IntegerToString(dt.year) + ".10.7"), dt1007);
MqlDateTime dt0407;
TimeToStruct((datetime)(IntegerToString(dt.year) + ".4.7"), dt0407);
start = (dt.year * 10000) + (10 * 100) + (7 - dt1007.day_of_week);
end = (dt.year * 10000) + (4 * 100) + (7 - dt0407.day_of_week);
return(today >= start || today < end);
}