簡體   English   中英

java.text.SimpleDateFormat#parse在Scala和Clojure之間具有不同的行為

[英]java.text.SimpleDateFormat#parse has different behaviour between Scala and Clojure

我正在嘗試使用SimpleDateFormatPDT字符串分配給java.util.Date

Scala,給我正確的格式是PDTUTC-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格式存儲日期?

看起來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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM