我一直在玩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”?
答案 0 :(得分:5)
当您只有目标偏移时,您可以使用clj-time.core/to-time-zone
使用clj-time.core/time-zone-for-offset
来应用时区,以便从您存储的UTC中获取本地化时间。
clj-time.format/formatters
地图中有许多现有的UTC格式化程序,但您始终可以从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)
答案 1 :(得分: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格式,请使用自定义格式化程序。您的示例将由模式"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"
答案 2 :(得分:3)
我认为使用格式化程序的时区支持构建
会更好(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年没有奏效:))