2017-04-16 394 views
1

我有一組日期的已保存到數據庫中使用下面的代碼(我不能改變):如何使用Groovy的.format()方法顯示本地時間?

Date date = new Date() 
save(date) 

是否有在Groovy沒有乾淨的方式重新格式化並顯示在用戶的日期當地時區?如...

dateCreated.format('h:mm a MMMM dd, yyyy', Locale.US) 

是不是像Groovy內置的那樣?是唯一的解決方案?

import java.text.SimpleDateFormat 

String date = dateCreated.format('h:mm a MMMM dd, yyyy') 
def fmt = new SimpleDateFormat('h:mm a MMMM dd, yyyy', Locale.US); 
Date local_time = fmt.parse(date); 
String formatted_local = local_time.format('h:mm a MMMM dd, yyyy') 
formatted_local 

Groovy的最新文檔:http://docs.groovy-lang.org/latest/html/groovy-jdk/java/util/Date.html#format(java.lang.String)

參考:How to parse month full form string using DateFormat in Java?

+0

我不明白你的問題,但如果你認爲它可以用Java做了,那麼它也可以在Groovy實現爲Java代碼是有效的Groovy。我會用'Date.parse('h:mm a MMMM dd,yyyy','6:31 PM June 27,2007')' – bdkosher

+0

有沒有更通用的方法?即假設日期在數據庫中以格式「MM-d-yyyy-h-mm-s」存儲,我如何使用Date.parse以新格式打印日期? –

+0

您將日期保存爲數據庫中的字符串? –

回答

1

應在Groovy中非常簡單。

假設,日期是使用下面的語句保存

def date = new Date() 
println date 

輸出

Sun Apr 16 11:10:14 UTC 2017 

如果你需要將其轉換爲與特定日期時間格式特定的時區,只需要使用下面的語句

println date.format('yyyy/MM/dd HH:mm', TimeZone.getTimeZone('IST')) 

將顯示輸出:

2017/04/16 16:40 

注:源是在UTC格式,並轉換現有日期到IST格式。

在情況下,如果你需要最新的對象(如上面提到的不串),以下用途:

def date = new Date() 
def dtFormat = "yyyy-MM-dd'T'HH:mm:ssZ" 
def dt = date.format(dtFormat, TimeZone.getTimeZone('IST')) 
assert dt instanceof String 

def newDate = Date.parse(dtFormat, dt) 
assert newDate instanceof Date 

你可以快速嘗試網上Demo

+1

FYI,麻煩的老的日期 - 時間類,如['java.util.Date'](https://docs.oracle.com/javase/8/docs/api/java/util/Date.html),[ 'java.util.Calendar'](https://docs.oracle.com/javase/8/docs/api/java/util/Calendar.html)和'java.text。SimpleTextFormat'現在是[legacy](https://en.wikipedia.org/wiki/Legacy_system),由[java.time]代替(https://docs.oracle.com/javase/8/docs/api/ java/time/package-summary.html)類。 –

1

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字母縮寫,如PDTIST,它們不是真正的時區,不是標準化的,甚至不是唯一的(!)。 Proper time zone name,格式爲continent/region,例如America/Montreal,Africa/CasablancaPacific/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::setObjectResultSet::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,YearQuartermore

+0

我會在下次嘗試。 Groovy/Grails似乎默認爲Java.util.Date,所以我認爲它是標準的。 Java.time看起來好多了。 –

+0

@DevonLuongo將java.time與傳統類進行比較就像比較[Yugo cars](https://en.m.wikipedia.org/wiki/Yugo)與本田汽車 - 完全沒有任何比較。 –

+0

更新:不幸的是,Grails與Java.time存在兼容性問題。臨時解決方案已張貼在這裏:http://stackoverflow.com/questions/32974704/grails-3-and-java-8-time-support –