Перейти к содержимому


Фотография

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

программирование OC

  • Авторизуйтесь для ответа в теме
Сообщений в теме: 11

#1 Оффлайн   Alex

Alex
  • Администраторы
  • Сообщений: 3 580
  • Уровень сигнала: 30,09%
  • В игре: 184 час. 25 мин.

Отправлено 22 Апрель 2015 - 20:53

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

 

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

Всякие счетчики работы Луа машины и ПК нам тоже не подходят, типа 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('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() здесь. 



#2 Оффлайн   KelLiN

KelLiN
  • Пользователи
  • Сообщений: 89
  • Уровень сигнала: 19,19%
  • В игре: 117 час. 37 мин.

Награды

                       

Отправлено 22 Апрель 2015 - 22:26

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

 

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


#3 Оффлайн   HeroBrine1st

HeroBrine1st
  • Пользователи
  • Сообщений: 52
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Награды

     

Отправлено 08 Апрель 2017 - 13:46

 

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

 

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

 

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



#4 Оффлайн   lokin135

lokin135
  • Пользователи
  • Сообщений: 28
  • Уровень сигнала: 108,74%
  • В игре: 666 час. 35 мин.
  • ГородПсков

Отправлено 14 Август 2017 - 18:57

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


  • eu_tomat это нравится

#5 Оффлайн   unlockd

unlockd
  • Пользователи
  • Сообщений: 1
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Отправлено 18 Сентябрь 2017 - 09:27

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

восстановление зренияm27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27
m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27
m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27
m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27
m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27
m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27
m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27
m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27
m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27
m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27
m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27m27


Сообщение отредактировал unlockd: 08 Октябрь 2017 - 07:28


#6 Оффлайн   Zer0Galaxy

Zer0Galaxy
  • Гуру
  • Сообщений: 1 213
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Награды

5                                 

Отправлено 18 Сентябрь 2017 - 09:33

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

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



#7 Оффлайн   Laine_prikol

Laine_prikol
  • Пользователи
  • Сообщений: 126
  • Уровень сигнала: 0,67%
  • В игре: 4 час. 6 мин.

Награды

        

Отправлено 20 Сентябрь 2017 - 17:06

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


Сообщение отредактировал Laine_prikol: 20 Сентябрь 2017 - 17:09


#8 Оффлайн   Zer0Galaxy

Zer0Galaxy
  • Гуру
  • Сообщений: 1 213
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Награды

5                                 

Отправлено 20 Сентябрь 2017 - 17:16

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



#9 Оффлайн   Alex

Alex
  • Автор темы
  • Администраторы
  • Сообщений: 3 580
  • Уровень сигнала: 30,09%
  • В игре: 184 час. 25 мин.

Отправлено 20 Сентябрь 2017 - 18:48

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

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

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

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



#10 Оффлайн   NEO

NEO

    Что происходит? Уже удаляют безобидные сообщения, что дальше?

  • Пользователи
  • Сообщений: 1 703
  • Уровень сигнала: 3,96%
  • В игре: 24 час. 15 мин.
  • ГородСолнце

Награды

   2                        

Отправлено 20 Сентябрь 2017 - 18:59

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


  • Alex это нравится

#11 Оффлайн   NEO

NEO

    Что происходит? Уже удаляют безобидные сообщения, что дальше?

  • Пользователи
  • Сообщений: 1 703
  • Уровень сигнала: 3,96%
  • В игре: 24 час. 15 мин.
  • ГородСолнце

Награды

   2                        

Отправлено 20 Сентябрь 2017 - 23:23

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


Сообщение отредактировал NEO: 21 Сентябрь 2017 - 16:33


#12 Оффлайн   eu_tomat

eu_tomat
  • Хранители Кода
  • Сообщений: 800
  • Уровень сигнала: 0,05%
  • В игре: 0 час. 19 мин.

Награды

                          

Отправлено 06 Январь 2018 - 15:27

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

А откуда взялся такой странный делитель?
fs.lastModified("/tmp/.time") / 1002.7
Разве не на 1000 нужно делить?






Темы с аналогичным тегами программирование, OC

Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных

Яндекс.Метрика