【问题标题】:java.text.SimpleDateFormat#parse has different behaviour between Scala and Clojurejava.text.SimpleDateFormat#parse 在 Scala 和 Clojure 之间有不同的行为
【发布时间】:2017-08-17 22:47:54
【问题描述】:

我正在尝试使用SimpleDateFormatPDT 字符串分配给java.util.Date

Scala 为我提供了正确的格式,即 PDT (UTC-07:00),无论是否设置 timeZone,因为我的操作系统 timeZone 是 "America/Los_Angeles"

scala> import java.util.TimeZone
import java.util.TimeZone

scala> import java.util.Date
import java.util.Date

scala> import java.text.SimpleDateFormat
import java.text.SimpleDateFormat

scala> TimeZone.getDefault
res0: java.util.TimeZone = sun.util.calendar.ZoneInfo[id="America/Los_Angeles",offset=-28800000,dstSavings=3600000,useDaylight=true,transitions=185,lastRule=java.util.SimpleTimeZone[id=America/Los_Angeles,offset=-28800000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=3,startMonth=2,startDay=8,startDayOfWeek=1,startTime=7200000,startTimeMode=0,endMode=3,endMonth=10,endDay=1,endDayOfWeek=1,endTime=7200000,endTimeMode=0]]

scala> val df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX")
df: java.text.SimpleDateFormat = java.text.SimpleDateFormat@fe8c5ede

scala> df.parse("2017-10-28T23:59:59-07:00")
res1: java.util.Date = Sat Oct 28 23:59:59 PDT 2017

但 Clojure 以 UTC 格式解析日期 (:UTC-00:00),

没有.setTimeZone

aws-creds.core=> (import 'java.util.TimeZone)
java.util.TimeZone

aws-creds.core=> (TimeZone/getDefault)
#object[sun.util.calendar.ZoneInfo 0x28ce2a1 "sun.util.calendar.ZoneInfo[id=\"America/Los_Angeles\",offset=-28800000,dstSavings=3600000,useDaylight=true,transitions=185,lastRule=java.util.SimpleTimeZone[id=America/Los_Angeles,offset=-28800000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=3,startMonth=2,startDay=8,startDayOfWeek=1,startTime=7200000,startTimeMode=0,endMode=3,endMonth=10,endDay=1,endDayOfWeek=1,endTime=7200000,endTimeMode=0]]"]

aws-creds.core=> (import 'java.util.Date)
java.util.Date

aws-creds.core=> (import 'java.text.SimpleDateFormat)
java.text.SimpleDateFormat

aws-creds.core=> (let [df (new SimpleDateFormat "yyyy-MM-dd'T'HH:mm:ssXXX" )]
            #_=>   (print (.parse df "2017-10-28T23:59:59-07:00")))
#inst "2017-10-29T06:59:59.000-00:00"nil

.setTimeZoneAmerica/Los_Angeles 的行为相同,

aws-creds.core=> (let [df (new SimpleDateFormat "yyyy-MM-dd'T'HH:mm:ssXXX" )]
            #_=>   (.setTimeZone df (TimeZone/getTimeZone "America/Los_Angeles"))
            #_=>   (print (.parse df "2017-10-28T23:59:59-07:00")))
#inst "2017-10-29T06:59:59.000-00:00"nil

这很奇怪,因为在这两种情况下我都使用java.text.SimpleDateFormat。好奇为什么SimpleDateFormat#parse scala 以PDT 格式存储日期而clojure 以UTC 格式存储?

【问题讨论】:

  • 您确定它们的配置没有不同吗?还是在不同的环境中运行?
  • 所有配置都在上面发布,除非我做一些愚蠢的事情,否则它们是相似的。两者都在同一个操作系统中。你可以看到 TimeZone/getDefault 用于 scala 和 clojure
  • 您发布的示例显示结果乱序和错误的格式字符串。
  • @som-snytt 你说的是res13res12?? TimeZone 无论如何都是一样的
  • OK 更明确地说,如果您显示的代码不起作用,我们无法帮助您。这个"yyyy:MM:dd'T'HH:mm:ssXXX" 不是你要解析的。

标签: java scala datetime clojure


【解决方案1】:

看起来 Clojure REPL 只是以 UTC 格式打印日期。

如果您在日期上调用 toString(),它会完全按照 Scala REPL(我相信在打印对象时隐式调用 toString)打印日期,并且在系统时区中:

user=> (let [df (new SimpleDateFormat "yyyy-MM-dd'T'HH:mm:ssXXX" )]
  #_=>   (print (.toString (.parse df "2017-10-28T23:59:59-07:00"))))
Sat Oct 28 23:59:59 PDT 2017nil

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-27
    • 1970-01-01
    • 1970-01-01
    • 2014-11-01
    • 1970-01-01
    • 2018-05-07
    • 1970-01-01
    相关资源
    最近更新 更多