clj-time и отображение в часовом поясе пользователя
Я играл с to-local-date-time, org.joda.time.DateTimeZone/getDefault, форматерами и т. Д., И до сих пор не могу понять, как получить дату-время, которое я сохранил как UTC для отображать в часовом поясе пользователя. В некоторых форматерах я могу отобразить время, но оно показывает время UTC со смещением. Например, если у меня 2013-10-05T19:02:25.641-04:00, как я могу отобразить "2013-10-05 14:02:25"?
3 ответа
Вы можете применить часовой пояс с clj-time.core/to-time-zone
, с помощью clj-time.core/time-zone-for-offset
когда у вас есть только смещение цели, чтобы получить локализованное время из сохраненного UTC.
Существует множество существующих форматеров UTC в clj-time.format/formatters
карта, но вы всегда можете создать свой собственный из clj-time.format/formatter
, или же clj-time.format/formatter-local
, а также clj-time.format/unparse
,
(require '[clj-time.core :as t]
'[clj-time.format :as f])
(defn formatlocal [n offset]
(let [nlocal (t/to-time-zone n (t/time-zone-for-offset offset))]
(f/unparse (f/formatter-local "yyyy-MM-dd hh:mm:ss aa")
nlocal)))
(formatlocal (t/now) -7)
Я думаю, что лучше использовать встроенную поддержку часового пояса от форматера
(require '[clj-time.core :as t]
'[clj-time.format :as f])
(def custom-time-formatter (f/with-zone (f/formatter "yyyy-MM-dd hh:mm:ss")
(t/default-time-zone)))
(f/unparse custom-time-formatter (t/now))
вместо (t/default-time-zone)
Вы можете использовать определенный часовой пояс или смещение (см. документацию clj-time.core)
(возможно, это не сработало в 2013 году:))
2013-10-05T19:02:25.641-04:00
местное время, которое будет временем UTC 2013-10-05T23:02:25.641Z
,
Если у вас есть действительное время UTC, не пытайтесь преобразовать его с to-local-date-time
! to-local-date-time
удобная функция для изменения часового пояса в экземпляре DateTime без преобразования времени. Чтобы правильно конвертировать время, используйте to-time-zone
вместо.
Чтобы форматировать DateTime без информации о часовом поясе, используйте пользовательский форматтер. Ваш пример будет создан по шаблону "yyyy-MM-dd HH:mm:ss"
,
Пример:
Определите время UTC:
time-test.core> (def t0 (date-time 2013 10 05 23 02 25 641))
#'time-test.core/t0
time-test.core> t0
#<DateTime 2013-10-05T23:02:25.641Z>
Перевести его в местное время:
time-test.core> (def t1 (to-time-zone t0 (time-zone-for-offset -4)))
#'time-test.core/t1
time-test.core> t1
#<DateTime 2013-10-05T19:02:25.641-04:00>
Отформатируйте местное время:
time-test.core> (unparse (formatter-local "yyyy-MM-dd HH:mm:ss") t1)
"2013-10-05 19:02:25"