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

aka*_*lou 1 date clojure formatter

Clojure代码

(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"
Run Code Online (Sandbox Code Playgroud)

类似的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);
    }
}
Run Code Online (Sandbox Code Playgroud)

虽然Java代码打印:2015年7月10日00:00:00 CEST 2015(这是我的预期),但Clojure转移了2个小时?

Mak*_*oto 6

Clojure instant和Java 之间存在差异Date,最重要的是时间偏移是可选的.

与RFC3339不同:

  • 我们只解析时间戳格式
  • timestamp可以删除尾随组件
  • 时间偏移是可选的(默认为+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))
Run Code Online (Sandbox Code Playgroud)