Germany | Finland | Saint Petersburg | Drive

Функции преобразования даты и времени

Опубликовано в QPILE

Дата и  время в QPILE имеют внутренний числовой фомат. Для времени это число формата HHMMSS, то есть 11 часов 43 минуты 5 секунд будут числом 114305. Для даты это YYYYMMDD. с одной стороны такое представление удобно для быстрого перевода в него строкого впредставления и назад, с другой представляет серьёзную проблему, когда требуется производить операции суммирования-вычитания с такими представлениями. В этой статье  приведу 4 функции, которые переводят внутреннее представление в строковое и обратно.

 

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Пребразует время из внутреннего int ЧЧММСС в текстовый HH:MM:SS
FUNC TimeIntToStr(return)
     result = add_zero(Floor(return/10000)) & ":" & add_zero(Mod(Floor(return/100),100)) & ":" & add_zero(Mod(return,100))
END FUNC



''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Преобразует дату из внутреннего int YYYYMMDD в строку ДД.ММ.ГГГГ
FUNC DateIntToStr(iDate)
               result = add_zero(Mod(iDate,100)) & "." & add_zero(Mod(Floor(iDate/100),100)) & "." &                Floor(iDate/10000)
END FUNC

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Преобразует время из строкового формата HH:MM:SS в во внутренний int HHMMSS.
' Разделители несущественны, пробелы/табуляции слева и лишние символы справа игнорируются
' Возможны укороченные форматы HH:MM или HH
FUNC TimeStrToInt(result)
               result = trim(result)
               result = 10000 * substr(result,0,2) + 100 * substr(result,3,2) + substr(result,6,2)
END FUNC

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Преобразует дату из строкового формата ДД.ММ.ГГГГ во внутренний int YYYYMMDD.
' Разделители несущественны, пробелы/табуляции слева и лишние символы справа игнорируются
FUNC DateStrToInt(result)
           result = trim(result)
           result = 0 + (substr(result,6,4) & substr(result,3,2) & substr(result,0,2))
END FUNC

 и одна служебная функция

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Добавляет 0 в начале строки, если требуется
FUNC Add_Zero(result)
    if 1 == Len(result)
             result = "0" & result
    else
             result = "" & result
    end if
END FUNC 

Комментарии   
# admin 27.08.2012 19:10
Можно иначе написать функцию TimeIntToStr и она по-прежнему будет работать всегда и без ограничений (в интернете полно вариантов и половина из них не будет работать раньше 10-00, а половина из оставшихся - в первом часу ночи)

FUNC TimeIntToStr(re sult)
result = 1000000+result
result = substr(result,1 ,2) & ":" & substr(result,3 ,2) & ":" & substr(result,5,2)
END FUNC

AddZero для варианта M4:
FUNC Add_Zero(result)
IIf(Len(result) == 1, result, "0"&result, ""&result)
EndFunc(result)


dnl Пребразует время из внутреннего int ЧЧММСС в текстовый HH:MM:SS
define(`TimeIntToStr',`substr(m4_arg($1)+1000000,1,2) & ":" & substr(m4_arg($ 1)+1000000,3,2) & ":" & substr(m4_arg($1)+1000000,5,2)')

dnl Преобразует дату из внутреннего int YYYYMMDD в строку ДД.ММ.ГГГГ
define(`DateIntToStr',`substr($1,6,2) & "." & substr($1,4,2) & "." & substr($1,0,4)')

# -------------------------------------------------------
# Получение количества секунд из HHMMSS
define(`SecondsFromHHMMSS',`Div(m4_arg($1),10000) * eval(60*60) + Mod(Div(m4_arg( $1),100),100) * 60 + Mod(m4_arg($1),100)')

# Получение HHMMSS из количества секунд
define(`HHMMSSFromSeconds',`Floor(m4_arg($1)/eval(60*60))*10000 + Mod(Floor(m4_ar g($1)/60),60)*1 00 + Mod(m4_arg($1),60)')

# Возвращает количество секунд, прошедших c момента $1 (start) до момента $2 (end). Формат времени HHMMSS.
define(`Time_Difference',`SecondsFromHHMMSS($2) - SecondsFromHHMM SS($1)')
Ответить | Ответить с цитатой | Цитировать
Добавить комментарий