Germany | Finland | Saint Petersburg | Drive

Функции time() и date() для qpile

Несмотря на то, что на замену qpile в терминале quik пришел lua, мне временами приходят просьбы дать эту функцию.

Даю. Она написана не на чистом qpile, а с использованием препроцессора. Однако перевести ее в обычный вид не составит огромного труда.

 

dnl --------------------------------------------------
dnl Округление до ближайшего кратного шагy вниз
define(`Floor_To_Step',`ifelse(`$2',,m4_error(`Missing `$0' argument(s)'),m4_arg(`$2'),1,Floor(`$1'),Div(`$1',`$2') * m4_arg(`$2'))')
dnl Целочисленное деление
define(`Div',`ifelse(`$2',1,Floor(`$1'),Floor(m4_arg(`$1')/m4_arg(`$2')))')
dnl Вычисление остатка от деления
define(`Mod',`ifelse(`$1',,m4_error(`Missing `$0' argument'),(m4_arg(`$1') - Floor_To_Step(`$1',`$2')))')
dnl ------------------------------------------------------------------
dnl Возвращает количестве дней в году. Параметр - количество прошедших лет после начала 1970
pushdef(`Days_In_Year',`366-Is_NonLeap_Year(`$1')')
dnl Возвращает True, если год не високосный и False, если високосный
pushdef(`Is_NonLeap_Year',`Sign(Mod(`$1' + 2,4))')
dnl --------------------------------------------------------------------
dnl Возвращает текстовую строку из количеств дней с начала года по конец каждого месяца по 3 символа на каждый месяц FUNC Days_By_Months(Result)
IIf(Is_NonLeap_Year(Result) == True,Result,
"000 31 59 90120151181212243273304334365",
"000 31 60 91121152182213244274305335366" )
EndFunc(Result)
dnl ------------------------------------------------------------------
dnl Возвращает количество секунд, прошедших с начала 1970 года
dnl Тип параметров времени и даты YYYYMMDD и HHMMSS FUNC UnixTime_From_yyyymmdd_hhmmss(yyyymmdd,hhmmss)
EndFunc( (result * 365 + Div(result+1,4) + substr(Days_By_Months(result),(Mod(Div(yyyymmdd,100),100)-1)*3,3) + Mod(yyyymmdd,100) - 1) * eval(60*60*24) + SecondsFromHHMMSS(hhmmss) )

dnl Получение количества секунд из HHMMSS. HH от 00 до 24 включительно
define(`SecondsFromHHMMSS',`Div(m4_arg(`$1'),10000) * eval(60*60) + Mod(Floor(m4_arg(`$1')/100),100) * 60 + Mod(m4_arg(`$1'),100)')
dnl ------------------------------------------------------------------
dnl Получение даты по количеству прошедших секунд с начала 1970 года
dnl Возвращает мар:
dnl "~HHMMSS" - время, внутренний формат qpile
dnl "~YYYYMMDD" - дата, внутренний формат qpile
dnl "~DAYOFWEEK" - номер дня недели (0 - воскресенье, 6 - суббота)
dnl "~DAYS" - количество дней, прошедших с 01.01.1970
dnl "~DAYOFYEAR" - количество дней, прошедших с начала текущего года
FUNC yyyymmdd_hhmmss_From_UnixTime(result)
Local(year,days,Seconds,yyyymmdd_hhmmss,sf_mm_str) pushdef(`seconds_in_day',eval(60*60*24))
days = Div(result,seconds_in_day)
Seconds = result - days*seconds_in_day
popdef(`seconds_in_day')

WithInit(yyyymmdd_hhmmss)
SetKey("~DAYOFWEEK",Mod(days+4,7),
"~DAYS",days,
"~HHMMSS",HHMMSSFromSeconds(Seconds)) dnl Узнаём номер дня в текущем году и количество прошедших с 1970 года лет
Loop(year)
result = Days_In_Year(year)
Until(days < result)
Dec(days,result)
EndLoop
SetKey("~DAYOFYEAR",days) sf_mm_str = Days_By_Months(year)
For(result,1,12)
if days < Float(substr(sf_mm_str,result*3,3))
SetKey("~YYYYMMDD",year*10000 + result*100 + days-substr(sf_mm_str,(result-1)*3,3) + 19700001)
Break
end if
end for
EndWith
EndFunc(yyyymmdd_hhmmss)
popdef(`Days_In_Year')
popdef(`Is_NonLeap_Year')

Если будут вопросы - отвечу.

 

Добавить комментарий