为什么在clojure中解析日期会将结果向后移动2小时



Clojure code

(def fmt (java.text.SimpleDateFormat. "yyyy-MM-dd"))
#'user/fmt
user=> (.parse fmt "2015-07-10")
#inst "2015-07-09T22:00:00.000-00:00"

类似Java代码:

public class DateFmt {
    public static void main(String[] args) throws ParseException {
        final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        final Date date = sdf.parse("2015-07-10");
        System.out.println(date);
    }
}

而Java代码打印:星期五七月10 00:00:00 CEST 2015(这是我所期望的),但Clojure转换2小时后?

Clojure的instant和Java的Date之间有一个区别,主要是时间偏移是可选的。

与RFC3339:

  • 只解析时间戳格式
  • 时间戳可以省略尾随组件
  • 时间偏移是可选的(默认为+00:00)

因此,Clojure的时间总是与UTC相关联,而Java则与您的本地时区相关联。

时间实际上是相等的,因为你比UTC早两个小时。

如果你想让Clojure输出与Java匹配,那么你必须指示SimpleDateFormat实例将时间读取为UTC。

(def fmt
  (let [format (java.text.SimpleDateFormat. "yyyy-MM-dd")]
    (.setTimeZone format (java.util.TimeZone/getTimeZone "UTC"))
    format))

最新更新