2011-08-18 79 views
5

我有下面的代碼Grails應用程序:Java的時間GMT

Date now = Calendar.getInstance().getTime() //Also tried new Date() 
println "now: " + now 

當我這樣做,我得到now: Thu Aug 18 12:47:09 CDT 2011。我需要日期格林威治標準時間,而不是當地時間,因爲我需要將GMT時間存儲在數據庫中。我可以使用simpleDateFormat對象打印出格林尼治標準時間,但我需要將其實際存儲爲GMT。

問題:如何使用GMT將Date對象轉換爲Date對象?

+0

@jpredham應該可能得到這個問題的「答案」,因爲他在檢索日期/時間格林威治標準時是正確的。 (我自己測試了它,發現它是真的。)另外他更新,我們其他人已經有相當一部分的聲望。 –

+0

僅供參考,麻煩的舊日期時間類,例如['java.util.Date'](https://docs.oracle.com/javase/9​​/docs/api/java/util/Date.html),[ 'java.util.Calendar'](https://docs.oracle.com/javase/9​​/docs/api/java/util/Calendar.html)和'java.text.SimpleDateFormat'現在是[legacy]( https://en.wikipedia.org/wiki/Legacy_system),由[java.time]代替(https://docs.oracle.com/javase/9​​/docs/api/java/time/package-summary。 html)內置到Java 8和Java 9中的類。請參見[Oracle教程](https://docs.oracle.com/javase/tutorial/datetime/TOC.html)。 –

回答

5

這突出說明了爲什麼Java在時間上很糟糕。以前的帖子都是關閉的,但我們需要非常小心獲取GMT時間的當前時間,並獲取當前時間CDT和它呼叫它GMT。

TimeZone reference = TimeZone.getTimeZone("GMT"); 
Calendar myCal = Calendar.getInstance(reference); 

這是格林威治標準時間的當前時間,GMT時區上下文。

要轉換爲Date對象,它保持不變區,您需要撥打:

TimeZone.setDefault(reference); 

此設置將持續,只要你目前的JVM。現在調用get Time應該產生期望的結果。

myCal.getTime(); 
+0

榮譽給你!我改變了我的帖子,以更好地反映你說的話。甚至ZONE_OFFSET也沒有用。接得好! –

+0

感謝您的幫助!這工作就像一個魅力! –

0

內部日曆對象以UTC(GMT的現代名稱)存儲時間。 getTimeInMillis()會返回一個UTC值,可能是您想要存儲的內容。

0

您應該嘗試GregorianCalendar#setTimeZone(TimeZone timeZone)。

0

使用System.currentTimeMillis()不僅比使用日曆或日期快得多,它總是給你GMT時間。如果你想顯示這個時間,你可以使用SimpleDateFormat,將時區設置爲你想要的。

2

好吧,如果你真的想在GMT時間,你需要把它作爲GMT(@jpredham是正確的。榮譽給你!編輯我的職務,以反映這一點)

所以做以下

//this option uses TimeZone 
TimeZone gmtTimeZone = TimeZone.getTimeZone("GMT"); 
TimeZone.setDefault(gmtTimeZone); 
Calendar calendar = Calender.getInstance(gmtTimeZone); 

Date myDate = calendar.getTime(); 
1

試試這個:

println Calendar.getInstance(TimeZone.getTimeZone('GMT')).format('HH:mm:ss') 

注意,當你轉換爲日期,你失去的時區信息。當Java/Groovy格式化日期以進行打印時,它會自動爲當地時區格式化它。別擔心,你的日期沒有與之相關的時區。當你像這樣顯示時,你可以重新添加適當的時區:

0

您正在混淆日期時間對象與其字符串表示形式。 Java中的所有常用日期 - 時間庫(java.util.Date,Joda-Time,Java 8中的java.time)在內部追蹤自1970年以來UTC時間以秒爲單位的小數秒數,而忽略閏秒。因此,在所有三個庫中,日期時間爲,內部爲,始終採用UTC/GMT。

因此,如何將日期對象轉換爲格林尼治標準時間(UTC)的日期對象的問題是沒有意義的。

兩個更好的庫(Joda-Time和java.time)也跟蹤日期時間對象內的時區。當調用toString方法時,臭名昭着的java.util.Date沒有分配任何時區,但仍會混淆地應用JVM的當前默認時區。

爲了記錄,Joda-Time爲此做了簡短的工作。

DateTime nowUtc = DateTime.now(DateTimeZone.UTC); 

調用該對象的toString方法在Zulu(UTC)時間生成ISO 8601格式的字符串。

搜索「Joda」和「formatter」的StackOverflow以查找調整到其他時區的許多示例。

0

TL;博士

Instant.now() // Capture current moment in UTC. 
    .toString() // Generate a String object in standard ISO 8601 format, YYYY-MM-DDTHH:MM:SS.SSSSSSSSSZ. 

2018-02-16T23:28:01.101324Z

java.time

現代的方法使用java.time類。完全避免麻煩的遺留日期 - 時間類。

Instant類表示UTC中的時間軸上的一個時刻,分辨率爲nanoseconds(小數點後最多九(9)位數字)。

Instant instant = Instant.now() ; // Capture the current moment in UTC. 

通過調用toString生成標準ISO 8601格式的字符串。

String output = instant.toString() ; 

如果您需要更多的靈活性比Instant提供,如格式化而生成的字符串,使用OffsetDateTime隨着不斷ZoneOffset.UTC

OffsetDateTime odt = OffsetDateTime.now(ZoneOffset.UTC) ; // Capture the current moment in UTC. 

要以非標準格式生成字符串,請使用DateTimeFormatter


關於java.time

java.time框架是建立在Java 8和更高版本。這些類代替了日期時間類legacy,如java.util.Date,Calendar,& SimpleDateFormat

Joda-Time項目,現在在maintenance mode,建議遷移到java.time類。請參閱Oracle Tutorial。並搜索堆棧溢出了很多例子和解釋。規格是JSR 310

使用JDBC driverJDBC 4.2或更高版本兼容的,你可以交換java.time直接對象與數據庫。不需要字符串和java.sql。*類。

從何處獲取java.time類?

ThreeTen-Extra項目與其他類擴展java.time。這個項目是未來可能增加java.time的一個試驗場。您可以在這裏找到一些有用的類,如Interval,YearWeek,YearQuartermore