2

我一直在玩 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”?

4

3 回答 3

6

我认为最好使用格式化程序的内置时区支持

(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 年不起作用:))

于 2015-08-31T11:30:12.303 回答
5

当您只有目标偏移量时,您可以clj-time.core/to-time-zone使用时区来从您存储的 UTC 中获取本地化时间。clj-time.core/time-zone-for-offset

地图中有许多现有的 UTC 格式化程序clj-time.format/formatters,但您始终可以从clj-time.format/formatter、 或clj-time.format/formatter-localclj-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)
于 2013-10-05T23:38:34.290 回答
3

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,请使用自定义格式化程序。您的示例将由 pattern 生成"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"
于 2013-10-05T23:43:55.130 回答