Дата/время в QLua(Lua)

Автор записи: Дмитрий (Admin)
1 звезда2 звезды3 звезды4 звезды5 звезд (Голосов 5, среднее: 4,20 из 5)
Загрузка...

Qlua-основы
Материал статьи взят здесь: http://www.bot4sale.ru/blog-menu/qlua/spisok-statej/368-lua-time.html

Дата/время в QLua(Lua) может быть представлено либо в виде секунд, прошедших с полуночи 1 января 1970 года, либо в виде таблицы, имеющей следующие поля:

   year - год (четыре цифры)
   month - месяц (1 – 12)
   day - день (1 – 31)
   hour - час (0 – 23)
   min - минуты (0 – 59)
   sec - секунды (0 – 59)
   wday - день недели (1 - 7), воскресенью соответствует 1
   yday - день года
   isdst - флаг дневного времени суток, тип boolean

Встроенные функции:

   os.clock() - возвращает время в секундах с точностью до миллисекунд с момента запуска приложения, в нашем случае QUIK. Пример: 1544.801
   os.time() - возвращает время в секундах, прошедших с полуночи 1 января 1970 года, может принимать вышеописанную таблицу, в качестве аргумента, без аргументов возвращает текущее время
   os.date() - возвращает форматированные дату/время, первым аргументом принимает формат, вторым аргументом принимает время в секундах. Аргументы не обязательны. Если не передать 2-й аргумент, функция вернет текущие дату/время компьютера. Если функцию вызвать вообще без аргументов, то она вернет текущие дату/время компьютера в виде 03/22/15 22:28:11

В строке формата можно использовать следующие опции:

%a   - день недели, сокр. (англ.) (пример, Wed)
%A   - день недели, полностью (англ.) (пример, Wednesday)
%b   - месяц, сокр. (англ.) (пример, Sep)
%B   - месяц, полностью (англ.) (пример, September)
%c   - дата и время (по-умолчанию) (пример, 03/22/15 22:28:11)
%d   - день месяца (пример, 22) [диапазон, 01-31]
%H   - час, в 24-х часовом формате (пример, 23) [диапазон, 00-23]
%I   - час, в 12-и часовом формате (пример, 11) [диапазон, 01-12]
%M   - минута (пример, 48) [диапазон, 00-59]
%m   - месяц (пример, 09) [диапазон, 01-12]
%p   - время суток "am", или "pm"
%S   - секунда (пример, 10) [диапазон, 00-59]
%w   - день недели (пример, 3) [диапазон, 0-6, соответствует Sunday-Saturday]
%x   - дата (пример, 09/16/98)
%X   - время (пример, 23:48:10)
%Y   - год, 4 цифры (пример, 2015)
%y   - год, 2 цифры (пример, 15) [00-99]
%%   - символ "%"
*t   - вернет таблицу
!*t  - вернет таблицу (по Гринвичу)

Примеры:

-- Представить произвольное время в секундах
datetime = { year  = 2015,
             month = 03,
             day   = 22,
             hour  = 22,
             min   = 28,
             sec   = 11
           };
seconds = os.time(datetime); -- в seconds будет значение 1427052491
 
-- Представить время в секундах в виде таблицы datetime
datetime = os.date("*t",seconds);
 
-- Преобразование строки даты/времени в таблицу datetime
dt = {};
dt.day,dt.month,dt.year,dt.hour,dt.min,dt.sec = string.match("22/03/2015 22:28:11","(%d*)/(%d*)/(%d*) (%d*):(%d*):(%d*)");
for key,value in pairs(dt) do dt[key] = tonumber(value) end
 
-- А так можно получить текущие дату/время сервера в виде таблицы datetime
dt = {};
dt.day,dt.month,dt.year,dt.hour,dt.min,dt.sec = string.match(getInfoParam('TRADEDATE')..' '..getInfoParam('SERVERTIME'),"(%d*).(%d*).(%d*) (%d*):(%d*):(%d*)")
for key,value in pairs(dt) do dt[key] = tonumber(value) end

Если у Вас появились какие-то вопросы, задайте их в комментариях под статьей !!!

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

Дата/время в QLua(Lua): 103 комментария

  1. Привет.
    Дополним сайт шпаргалкой по времени. Как прибавить(или отнять) пять секунд к текущему времени.
    Например надо узнать прошло ли пять секунд?

    1. Привет, математика со временем возможна после представления времени в секундах:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      
      local exitflag
      function main()
        local px = os.time()
        local next_px = px + 5
        message(" px= " .. os.date("%H:%M:%S", px) .."\n next_px= " .. os.date("%H:%M:%S", px), 2)
        repeat sleep(1)
          px = os.time()
        until px == next_px or exitflag
        message(" px= " .. os.date("%H:%M:%S", px), 2)
      end
      function OnStop() exitflag = true end
    1. local dt = {}
      dt.day, dt.month, dt.year = string.match(getInfoParam("TRADEDATE"),"(%d*)%p(%d*)%p(%d*)")
      dt.hour, dt.min, dt.sec = string.match(getInfoParam("SERVERTIME"), "(%d%d)%p(%d%d)%p(%d%d)")
      message(os.date("%Y%m%d_ %H%M", os.time(dt)))

  2. Столько лет запускал сложный код:

    message(os.date())
    
    
    В 6-м квике получал как в описании команды выше:
    
    10/06/20 15:43:33
    
    В 8-м квике получаю (тадам!!!) 
    
    Tue Oct  6 15:43:33 2020
    
    Кто-нибудь знает почему?
    
    И как сделать так как было?
    1. Lua 5.3 os.date - Когда вызвана без аргументов, date возвращает разумное представление даты и времени, зависящее от хостовой системы и текущей локали (т.е. os.date() эквивалентно os.date("%c")).
      Так пойдет?
      message(os.date("%x %X", os.time()))

      1. Спасибо, kalikazandr, ваш вариант дает точно то же, что и мой корявый message(os.date("%x".." ".."%X")), мне подходит.

        Но зачем в вашем варианте ", os.time()" ?

        В таком исполнении message(os.date("%x %X")) получается тоже самое, что и message(os.date("%x %X", os.time())).

        "Когда вызвана без аргументов, date возвращает разумное представление даты и времени, зависящее от хостовой системы и текущей локали (т.е. os.date() эквивалентно os.date("%c"))"

        Два одновремено работающих на одном компьютере квика, 6 и 8 версии, дают разные результаты и в варианте os.date("%c") и в варианте os.date().

        А нет варианта программно определить в какой версии LUA запущен скрипт?

          1. Сейчас заметил, что os.date() выдает время на час больше реального.
            Потестил оставшимся с октября кодом:

            1
            2
            3
            4
            
            message(tostring(os.date("%c")))
            message(dtod(os.date()))
            message(os.date("%x %X"))
            message(os.date("%x".." ".."%X"))

            И все в один голос говорят, что дневная сессия давно закончена.

            Стоит Win7, часовой пояс Москва, автоматический переход на летнее время и обратно отключен.