Перейти к публикации
Форум - ComputerCraft
Alex

Получение точного реального времени

Рекомендованные сообщения

Так как GET запросы, например, к  http://www.timeapi.org/utc/now , требуют на выполнение определенного времени, до нескольких секунд, наличия интернет карты и кучи телодвижений, есть еще один вариант получения астрономического времени. Точное оно настолько, насколько точно его настроил админ на хосте.

 

Стандартные функции date +%s  в консоли и в интерпретаторе os.date() выдают пока черти что, 1970 год и время с потолка.

Всякие счетчики работы Луа машины и ПК нам тоже не подходят, типа os.clock() и прочих.

 

Но есть один способ. В ОС можно получить дату модификации файла методом lastModified('filename') из библиотеки filesystem в формате UNIX

Ним и воспользуемся. Модифицируем вспомагательный файл и получим время модификации тут же.

 

 

Вот функция получения времени:

-- ======машинное время (время хоста)=======

-- раскомментируйте библиотеку, если она не подключена в вашем коде
--local fs = require("filesystem")  

--(установить для своего часового пояса, -12 : +13, например: -2 или 6)
local TIME_ZONE = 2  

--(не изменять!)
local t_correction = TIME_ZONE * 3600 

local function getTimeHost()
    local file = io.open('/tmp/unix.tmp', 'w')
    file:write('')
    file:close()
    local lastmod = tonumber(string.sub(fs.lastModified('UNIX.tmp'), 1, -4)) + t_correction
    
    --print(lastmod)


    -- Вариант 1
    --local data = os.date('%x', lastmod)
    --local time = os.date('%X', lastmod)
    --return data, time

    -- Вариант 2, eсли нужно все по отдельности
    --local year = os.date('%Y', lastmod)
    --local month = os.date('%m', lastmod)
    --local day = os.date('%d', lastmod)
    --local weekday = os.date('%A', lastmod)
    --local hour = os.date('%H', lastmod)
    --local minute  = os.date('%M', lastmod)
    --local sec  = os.date('%S', lastmod)    
    --return year, month, day, weekday, hour, minute, sec

    -- Вариант 3, но есть нюанс, если число минут(часов) 5, то и будет выдано 5, а не 05!
    --local dt = os.date('*t', lastmod)
    --return dt.year, dt.month, dt.day, dt.hour, dt.min, dt.sec
    
    -- Вариант 4, все в куче, как мы привыкли, в правильном формате
    local dt = os.date('%Y.%m.%d %H:%M:%S', lastmod)
    return dt
end

print(getTimeHost())

Вот выдержка из Советской Энциклопедии о UNIX времени. 

 

Часовой пояс установите, как Вам угодно (например, сейчас 2 на ИТ - это время Киев, 3 - МСК). Формат, который возвращает функция, тоже выберите, какой Вам удобно. Лишние закомментированные строки (--)  удалите.

Теперь легко можно в лог записать любое событие и приписать ему время. Так же можно легко узнать дату и день недели через 234 часов, 36 мин, 40 сек, например, предварительно переведя временной интервал в секунды и потом вернуть астрономическое время. Например вы хотите узнать, через сколько на ИТ вы скрафтите 100К ведер жидкой материи. Это например, 2256 год, 1 апреля, 12:50:12, если не останавливать "генмат" не на секунду ;)

 

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

Вариант 1: string, string     04/22/15  09:05:56

Вариант 2: number, number, number, string, number, number, number     2015 04 22   Wednesday 09   05  56

Вариант 3: number, number, number, number, number, number     2015 04  22    9   5  56

Вариант 4: string     2015.04.22 09:05:56

и т.п.

 

По сути вся функция, это 7 строчек. Не нужно никаких гетзапросов выполнять, библ всяких и интернет карт.

 

Подробнее о форматах os.date() здесь. 

  • Like 7

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Неординарное решение.
Команда date +%s возвращает обычное unix время компа с 1973. Просто в майнкрафте минута за час. Вот оно и насчитало уже до 1990 года. Можно аптайм сервера посчитать.

 

Главное чтобы автор не пофиксил lastModified('filename') до чтения времени майнкрафт. Вообще его бы попросить командочку сделать возвращать время машины, а не игровое время.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

Неординарное решение.
Команда date +%s возвращает обычное unix время компа с 1973. Просто в майнкрафте минута за час. Вот оно и насчитало уже до 1990 года. Можно аптайм сервера посчитать.

 

Главное чтобы автор не пофиксил lastModified('filename') до чтения времени майнкрафт. Вообще его бы попросить командочку сделать возвращать время машины, а не игровое время.

 

и не пофиксит. эта функция является C функцией машины. проще говоря, время lastModified берет не с потолка, а читает через C библиотеку время создания файла и отправляет в lua

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А функция time разве не работает точно?

Изменено пользователем eu_tomat
спам

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А функция time разве не работает точно?

Функция os.time() возвращает внутриигровое время.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Проще парсить время с какого-нибудь сайта. и потом возращать реальное время и не мучится, да долго но не особо сложно

Изменено пользователем Laine_prikol

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Верно. Когда то Алекс и такую функцию выкладывал, но для этого интернет-карта нужна.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

@@Zer0Galaxy ага. И это очень долго. До 4~5  сек. порой GET-запрос занимал.

Честно говоря, я так и не понял замысла, зачем это сделано os.time()

переопределена, выводит внутриигровое время, начиная с создания мира. 
Учтите, что время указывается во внутриигровых "секундах". 
Чтобы получить число тактов домножте это значение на 1000/60/60 (в одном дне 24000 тактов) 
и вычтите 6000. Это число (6000) взято не случайным образом. 
Новая игра в Minecraft начинается в "полдень", который и считается точкой отсчета времени (ноль).

видимо, были какое-то причины на то, что разраб мода решил не возвращать реальное системное время. Хотя какой толк от этого времени создания мира в сек, если админ любой может его обнулить в любой момент.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Надо добавлять фичу в ОТ

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Покопался в исходниках ОС, на самом деле есть функция которая возвращает время в секундах, но только в machine.lua, дальше Санги её не пустил.

Изменено пользователем NEO

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

не актуально, вот полу-рабочий вариант (часы/минуты подкоректировать нужно) https://pastebin.com/vCihbKm1

А откуда взялся такой странный делитель?

fs.lastModified("/tmp/.time") / 1002.7
Разве не на 1000 нужно делить?
  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
4 минуты назад, hohserg сказал:

Мб, погрешность?

Что ты в данном случае называешь погрешностью? Секунда системного времени не обязана точно совпадать ни с атомной, ни с астрономической секундой.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

×