Создать объект TimeWithZone из целого числа (unix время эпохи с точностью до миллисекунды) и с указанной зоной (строка) - PullRequest
0 голосов
/ 08 апреля 2020

У меня есть целое число, которое представляет unix время эпохи с точностью до миллисекунды и строку часового пояса. Мне нужно создать объект TimeWithZone с ними.

epoch_ms_integer = 1586653140000

time_zone = "America/Los_Angeles"

Попытка преобразовать в:

Sat, 11 Apr 2020 20:59:00 PDT -07:00

Мне удалось выполнить sh, выполнив: Time.at(epoch_ms_integer/1000).asctime.in_time_zone("America/Los_Angeles"), но мне было интересно, является ли это лучшим способом для достижения этой цели. В приложении, над которым я работаю, настроен часовой пояс EST / EDT, поэтому Time.at(epoch_ms_integer/1000) возвращает 2020-04-11 20:59:00 -0400.

Мне удалось найти решение asctime в одном из ответов здесь Ruby / Rails - Изменить часовой пояс времени, не меняя значения

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

1 Ответ

1 голос
/ 08 апреля 2020

Если предположить, что метка времени указана в миллисекундах, то 1586653140000 равно

Epoch: 1586653140
  GMT: Sunday,   April 12, 2020 12:59:00 AM 
  PDT: Saturday, April 11, 2020 17:59:00 PM -in time zone America/Los Angeles

Это всего лишь 3 различных способа обращения к конкретному c моменту времени во всем мире. Сб, 11 апреля 2020 20:59:00 PDT -07: 00 и 2020-04-11 20:59:00 -0400 каждый относится к разным моментам времени, а не к эпохе (1586653140)

Поскольку Unix эпоха (или Unix время, или время POSIX, или Unix отметка времени) - это количество секунд, прошедших с 1 января 1970 года (полночь UTC / GMT), не имеет смысла брать 1586653140 и измените только часовой пояс, не добавляя смещение зоны, потому что теперь вы говорите о другом моменте времени.

Чтобы получить правильный «перевод» из эпохи в любой часовой пояс, вы можете просто сделать

Time.zone = "GMT"
Time.zone.at(1586653140)
=> Sun, 12 Apr 2020 00:59:00 GMT +00:00
Time.zone = "America/Los_Angeles"
Time.zone.at(1586653140)
=> Sat, 11 Apr 2020 17:59:00 PDT -07:00

При работе с датами в часовых поясах в рельсах важно использовать только функции, учитывающие установленный часовой пояс:

НЕ ИСПОЛЬЗОВАТЬ

  • Time.now
  • Date.today
  • Date.today.to_time
  • Time.parse ("2015-07-04 17:05:37")
  • Time.strptime (строка, "% Y-% m-% dT% H:% M:% S% z")

DO USE

  • Time.current
  • 2.hours.a * 1 063 *
  • Time.zone.today
  • Date.current
  • 1.day.from_now
  • Time.zone.parse ("2015-07- 04 17:05:37 ")
  • Time.strptime (строка,"% Y-% m-% dT% H:% M:% S% z "). In_time_zone

Также следует помнить, что в приложении Rails у нас есть три разных часовых пояса:

  • системное время,
  • время приложения и
  • время базы данных.

Эта запись от mindbot объясняет все ясно.

...