Использование Lua для форматирования 0 секунд как 00:00:00

Я пытаюсь отформатировать продолжительность (в секундах) как время, и я получаю результаты, указывающие на то, что я должен где-то учитывать эпоху. Я ожидал, что os.date("%X", 0) выдаст «00:00:00», но он возвращает «20:00:00», а также значение даты «31/12/69» (хотя мне не нужна календарная дата).

Есть ли стандартный способ получить строку продолжительности времени, которая заставляет 0 секунд создавать часы, представляющие в общей сложности ноль секунд? Кажется, я нигде не могу найти пример того, что я пытаюсь сделать.

Спасибо


person Patillac    schedule 04.07.2013    source источник


Ответы (2)


В большинстве систем (например, POSIX) os.date("%X",0) указывает время эпохи, то есть 00:00:00 (всемирное координированное время, UTC), 1 января 1970 года. Вы получаете 20:00:00, потому что находитесь в другом часовом поясе.

Чтобы использовать UTC вместо вашего часового пояса, начните формат с !. Это упоминается в руководстве.

Итак, используйте os.date("!%X",0), чтобы получить 00:00:00 по желанию. Он будет работать с любым количеством секунд меньше суток (86400). Например, os.date("!%X",70) дает 00:01:10: 1 минуту и ​​10 секунд.

person lhf    schedule 05.07.2013

Lua не имеет обширной стандартной библиотеки:

string.format("%.2d:%.2d:%.2d", s/(60*60), s/60%60, s%60)
person mxcl    schedule 04.07.2013
comment
Это отлично работает после исправления порядка операций: s/(60*60) - person Patillac; 04.07.2013
comment
Да, извините, не проверял. Также я пропустил модуль в минутах. - person mxcl; 04.07.2013
comment
os.date может это сделать. Смотрите мой ответ. - person lhf; 05.07.2013
comment
Заманчиво, но... нет. В половине случаев %d будет округлять числа в большую сторону, что нехорошо. Например. 90 секунд отображаются как 00:02:30 вместо 00:01:30 - person Nas Banov; 14.12.2015
comment
Это больше не работает в Lua 5.3.x, так как %d требует ввода целого числа. Конечно, вы всегда можете обойти это, обернув math.floor. - person Electrix; 02.08.2017