TL;博士
ZonedDateTime.parse (
"Mon Apr 03 16:49:56 PDT 2017" ,
DateTimeFormatter.ofPattern ("EEE MMM dd HH:mm:ss z uuuu", Locale.US)
)
語法
對不起,我不知道Groovy語法,所以這是Java語法。
java.util.Date::toString
你是說值是通過調用java.util.Date::toString
保存到你的數據庫爲文本數據類型?
因此,現在您需要解析由java.util.Date::toString
(例如Mon Apr 03 16:49:56 PDT 2017
)使用的默認格式中的字符串以返回到日期時間對象。
首先,您必須已經知道這是存儲日期時間值的一種可怕的方式。該格式採用英文,並且可以減少任何一秒的時間。這種格式很難被人讀出,很難被機器解析。它使用僞時區的3-4字母縮寫,如PDT
或IST
,它們不是真正的時區,不是標準化的,甚至不是唯一的(!)。 Proper time zone name,格式爲continent/region
,例如America/Montreal
,Africa/Casablanca
或Pacific/Auckland
。
ISO 8601
相反,序列化日期時間值時,使用標準ISO 8601格式。
java.time類在解析和生成字符串時默認使用標準ISO 8601格式。
避免遺留日期時類
要知道,java.util.Date
與Java的早期版本中捆綁了麻煩的設計拙劣的混亂舊日期時間類之一。這些課程現在已成爲傳統課程,取而代之的是java.time課程。避免遺留類,而是使用java.time。
使用java.time
的DateTimeFormatter
類解析字符串。我們必須定義格式模式以匹配Date::toString
的輸出。
String input = "Mon Apr 03 16:49:56 PDT 2017" ;
DateTimeFormatter f = DateTimeFormatter.ofPattern ("EEE MMM dd HH:mm:ss z uuuu", Locale.US) ;
現在我們可以將該字符串解析爲ZonedDateTime
。
ZonedDateTime zdt = ZonedDateTime.parse (input, f) ;
zdt.toString():2017-04-03T16:49:56-07:00 [美國/洛杉磯]
一般對於用於序列化的日期 - 時間值的最佳實踐數據存儲和交換將保持UTC值,然後以標準ISO 8601格式生成一個字符串。 ISO 8601中UTC的約定是附加Z
,簡寫爲Zulu
,意思是UTC。
Instant
類表示UTC中的時間軸上的一個時刻,分辨率爲nanoseconds(最多九(9)位小數)。
Instant instant = zdt.toInstant() ;
String output = instant.toString() ;
instant.toString():2017-04-03T23:49:56Z
JDBC
您的問題和意見是不明確的。如果您的值使用適當的日期時間類型存儲在數據庫中,則不需要像上面討論的那樣混淆字符串。如果存儲得當,你應該讓你的JDBC驅動程序在進行必要的轉換的同時,執行從數據庫中取出數據的工作。
符合JDBC 4.2及更高版本的驅動程序可以通過PreparedStatement::setObject
和ResultSet::getObject
直接使用java.time類型。
關於java。時間
java.time框架內置於Java 8及更高版本。這些類取代了日期時間類legacy,如java.util.Date
,Calendar
,& SimpleDateFormat
。
Joda-Time項目現在位於maintenance mode,建議遷移到java.time類。請參閱Oracle Tutorial。並搜索堆棧溢出了很多例子和解釋。規格是JSR 310。
從何處獲取java.time類?
的ThreeTen-Extra項目與其他類擴展java.time。這個項目是未來可能增加java.time的一個試驗場。您可以在這裏找到一些有用的類,如Interval
,YearWeek
,YearQuarter
和more。
我不明白你的問題,但如果你認爲它可以用Java做了,那麼它也可以在Groovy實現爲Java代碼是有效的Groovy。我會用'Date.parse('h:mm a MMMM dd,yyyy','6:31 PM June 27,2007')' – bdkosher
有沒有更通用的方法?即假設日期在數據庫中以格式「MM-d-yyyy-h-mm-s」存儲,我如何使用Date.parse以新格式打印日期? –
您將日期保存爲數據庫中的字符串? –