Alex 4 683 Опубликовано: 22 апреля, 2015 Так как 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() здесь. 7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
KelLiN 49 Опубликовано: 22 апреля, 2015 Неординарное решение. Команда date +%s возвращает обычное unix время компа с 1973. Просто в майнкрафте минута за час. Вот оно и насчитало уже до 1990 года. Можно аптайм сервера посчитать. Главное чтобы автор не пофиксил lastModified('filename') до чтения времени майнкрафт. Вообще его бы попросить командочку сделать возвращать время машины, а не игровое время. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
HeroBrine1st 88 Опубликовано: 8 апреля, 2017 Неординарное решение. Команда date +%s возвращает обычное unix время компа с 1973. Просто в майнкрафте минута за час. Вот оно и насчитало уже до 1990 года. Можно аптайм сервера посчитать. Главное чтобы автор не пофиксил lastModified('filename') до чтения времени майнкрафт. Вообще его бы попросить командочку сделать возвращать время машины, а не игровое время. и не пофиксит. эта функция является C функцией машины. проще говоря, время lastModified берет не с потолка, а читает через C библиотеку время создания файла и отправляет в lua Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
lokin135 24 Опубликовано: 14 августа, 2017 не актуально, вот полу-рабочий вариант (часы/минуты подкоректировать нужно) https://pastebin.com/vCihbKm1 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
unlockd 0 Опубликовано: 18 сентября, 2017 (изменено) А функция time разве не работает точно? Изменено 16 сентября, 2018 пользователем eu_tomat спам Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Zer0Galaxy 2 187 Опубликовано: 18 сентября, 2017 А функция time разве не работает точно? Функция os.time() возвращает внутриигровое время. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Laine_prikol 48 Опубликовано: 20 сентября, 2017 (изменено) Проще парсить время с какого-нибудь сайта. и потом возращать реальное время и не мучится, да долго но не особо сложно Изменено 20 сентября, 2017 пользователем Laine_prikol Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Zer0Galaxy 2 187 Опубликовано: 20 сентября, 2017 Верно. Когда то Алекс и такую функцию выкладывал, но для этого интернет-карта нужна. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Alex Автор темы 4 683 Опубликовано: 20 сентября, 2017 @@Zer0Galaxy ага. И это очень долго. До 4~5 сек. порой GET-запрос занимал.Честно говоря, я так и не понял замысла, зачем это сделано os.time() переопределена, выводит внутриигровое время, начиная с создания мира. Учтите, что время указывается во внутриигровых "секундах". Чтобы получить число тактов домножте это значение на 1000/60/60 (в одном дне 24000 тактов) и вычтите 6000. Это число (6000) взято не случайным образом. Новая игра в Minecraft начинается в "полдень", который и считается точкой отсчета времени (ноль). видимо, были какое-то причины на то, что разраб мода решил не возвращать реальное системное время. Хотя какой толк от этого времени создания мира в сек, если админ любой может его обнулить в любой момент. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
NEO 541 Опубликовано: 20 сентября, 2017 Надо добавлять фичу в ОТ 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
NEO 541 Опубликовано: 20 сентября, 2017 (изменено) Покопался в исходниках ОС, на самом деле есть функция которая возвращает время в секундах, но только в machine.lua, дальше Санги её не пустил. Изменено 21 сентября, 2017 пользователем NEO Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
eu_tomat 2 154 Опубликовано: 6 января, 2018 не актуально, вот полу-рабочий вариант (часы/минуты подкоректировать нужно) https://pastebin.com/vCihbKm1А откуда взялся такой странный делитель? fs.lastModified("/tmp/.time") / 1002.7Разве не на 1000 нужно делить? 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
hohserg 197 Опубликовано: 11 декабря, 2018 Мб, погрешность? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
eu_tomat 2 154 Опубликовано: 11 декабря, 2018 4 минуты назад, hohserg сказал: Мб, погрешность? Что ты в данном случае называешь погрешностью? Секунда системного времени не обязана точно совпадать ни с атомной, ни с астрономической секундой. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах