2016-06-15 3 views
1

Я использую Rails 4.2.3. Я хочу потратить время в миллисекундах (продолжительность, а не время UTC) и преобразовать его в часы, минуты и секунды. Я пробовал этоНе удалось преобразовать миллисекунды в красиво отформатированные часы, минуты и секунды.

Time.at(time_in_ms).utc.strftime("%H:%M:%S") 

но это, кажется, не работает. Например, в моей базе данных PostgreSQL, у меня есть такое количество миллисекунд

3601000 

и выше продуцирующие

16:16:40 

даже если она должна производить что-то вроде «1:00:01» (один час и одна секунда). Каким образом можно преобразовать время в миллисекундах в хорошо отформатированные часы, минуты и секунды?

ответ

1

Time.at() ожидает время в секундпосле определенной эпохи - 1 января 1970 00:00:00 UTC - так что ваш код должен разделить ms цифру на 1000 первых:

Time.at(time_in_ms/1000).utc.strftime("%H:%M:%S") 

EDIT: Я только что перепроверял документы Ruby: ниже наездника ! Заданное количество секунд предполагается в UTC, поэтому at() делает расчет THEN в UTC смещении. Вышеуказанный .utc отменяет факторинг и требуется.

Конечно, проблема с этим кодом становится вашим текущим часовым поясом. Скажем, вы находитесь в UTC-5 (время в Нью-Йорке): Time.at(3601000/1000) становится "01:00:01" по местному времени. Преобразование его в UTC вычитало бы пять часов с цифры часа, делая его "20:00:01". Так удалить .utc преобразования тоже:

Time.at(time_in_ms/1000).strftime("%H:%M:%S") 
+0

Привет, Я попробовал ваше второе выражение, но это тот результат, «20:00:01» для «3601000» времени в миллисекундах. Это должно быть сделано «1:00:01», нет? –

+0

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

+0

Выражение «3601000» - это продолжительность, а не время с 1970 года или любая другая фраза. Я хотел бы написать выражение для форматирования. Taht выведет тот же номер «1:00:01» независимо от того, в какой часовой зоне я нахожусь, так как я не имею в виду часовое время, как таковое. Имеет ли это смысл? –

Смежные вопросы