2013-10-05 36 views
2

我一直在玩到本地日期时间,org.joda.time.DateTimeZone/getDefault,格式化程序等,我仍然无法弄清楚如何获取我存储为UTC的日期时间以显示在用户的时区中。有些格式化程序可以显示时间,但它显示UTC时间和偏移量。例如,如果我有2013-10-05T19:02:25.641-04:00,我怎样才能让它显示“2013-10-05 14:02:25”?clj时间和在用户的时区显示

回答

5

您可以将时区应用于clj-time.core/to-time-zone,使用clj-time.core/time-zone-for-offset(只有目标偏移量)才能从存储的UTC获取本地化时间。

clj-time.format/formatters地图中有许多现有的UTC格式化程序,但您始终可以从clj-time.format/formatterclj-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) 
+2

如果你在模式中使用'hh',你也应该使用'aa'。否则,使用'HH'。 –

+0

是的。更新我的样本以反映这一点。 – Jared314

3

2013-10-05T19:02:25.641-04:00当地的时间,这将是UTC时间2013-10-05T23:02:25.641Z

如果你有一个有效的UTC时间,做不是尝试将它转换为to-local-date-timeto-local-date-time是一个方便的功能,用于在不转换时间的情况下更改DateTime实例上的时区。要正确转换时间,请改用to-time-zone

要格式化没有时区信息的日期时间,请使用自定义格式器。你的例子将由模式"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" 
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年没有工作:))

相关问题