MQL4 文档声明 datetime 类型在内部表示为自商定时间尺度数据(即 1970-01-01 00:00强>)。
这说 (并稍微修饰一下语法合规性)
代码
可以读
oneYear = 60 * 60 * 24 * 365; // yes, astronomers would kill me
// for not solving those seconds,
// that sum up until a leap year
// consumes 'em on Feb-29th day :o)
另一种选择
以便更多地操作
datetime
舒适的方式,寻址
datetime 的自然组件是 hacky,但值得:
字符串到时间
string TimeToString( datetime aDatetimeVALUE,
int aModeOfDISPLAY = TIME_DATE|TIME_MINUTES
)
将包含自 01.01.1970 以来经过的时间(以秒为单位)的值转换为 string 的 "yyyy.mm.dd hh:mi" 格式。
在这里,可以简单地将 +1 添加到此中间格式的适当位置(无需处理 struct MqlDateTime 中存在的所有派生和影响值,其中 day_of_week 和day_of_year 绝对不是我最喜欢在移动 +1 个月等后重新计算的。
aCurrentYEAR = int( StringSubstr( aDatetimeSTRING, 0, 4 ) );
aCurrentMONTH = int( StringSubstr( aDatetimeSTRING, 5, 2 ) );
aCurrentDAY = int( StringSubstr( aDatetimeSTRING, 8, 2 ) );
aNextYEAR = aCurrentYEAR + 1;
aNextMONTH = aCurrentMONTH + 1;
终于
StringFormat( "%04d.%02d.%02d 00:00", aYearNUMBER, aMonthNUMBER, aDayNUMBER )
将重新组装以调用另一个 MQL4 标准函数:
datetime StringToTime( string aDatetimeSTRING )
该函数将"yyyy.mm.dd [hh:mi]"格式的包含时间或日期的字符串转换为datetime类型。
另一种方法可以使用完全分解的 datetime 算法,方法是使用
int aYE = TimeYear( aDatetimeVALUE );
int aMO = TimeMonth( aDatetimeVALUE );
int aDA = TimeDay( aDatetimeVALUE );
int aHO = TimeHour( aDatetimeVALUE );
int aMI = TimeMinute( aDatetimeVALUE );
int aDoW = TimeDayOfWeek( aDatetimeVALUE );
int aDoY = TimeDayOfYear( aDatetimeVALUE );
datetime aSameTimeNextYEAR = StructToTime( (MqlDateTime) { aYE + 1,
aMO,
aDA,
aHO,
aMI,
aDoW,
aDoY
}
);