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"
Другие вопросы по тегам