2009-11-26 109 views
1

好的 - 我覺得很愚蠢的問這樣一個基本的問題,但嘿。如何在Java中的不同TimeZone中獲取當前時間?

我試圖在Java Web應用程序中獲取不同時區中的當前時間。我嘗試了以下明顯的解決辦法:在我的servlet,

Calendar localCalendar = Calendar.getInstance(myBean.getTimeZone());

然後我通過日曆對象通過一個JSP作爲一個請求屬性「localCalendar」:

It is now: [${requestScope.localCalendar.time}] 
in TimeZone ${requestScope.localCalendar.timeZone.ID} 

但我的輸出似乎忽視了時區設置,即

It is now: [Thu Nov 26 10:01:03 GMT 2009] in TimeZone Indian/Mahe

我猜它是與祿啤酒設置,有沒有什麼辦法來獲取格式化爲我的語言環境,在另一個時區?

回答

6

Calendar內部數據基本上是:

在時間瞬間可由毫秒值來表示該是1970年1月1日00:00:00.000 GMT(格里高利)時代的偏移量。

所以,它擁有一個long,這將是相同的,無論你使用它什麼樣的操作和toString不作任何承諾。

您想按照區域設置和時區格式化日期。您可以使用JSTL之類的東西在表示層(JSP)中執行此操作,也可以使用DateFormat格式化bean中的日期,然後將該值作爲字符串返回。

+0

完美 - JSTL格式化標籤確實包含一個需要時區屬性的formatDate。我只是沒有考慮將時區作爲格式化的東西......但是,嘿,它的工作原理。謝謝! – Brabster

0

answer by McDowell是正確的,但java.util.Calendar(和java.util.Date)類已過時。

java.time

的java.time框架內置的Java 8和更高版本,和背移植到Java 6 & 7和到Android。這些新課程取代了舊的日期時間課程,因爲它們已被證明設計不佳,令人困惑和麻煩。

Instant是UTC中的當前時刻。

Instant now = Instant.now(); 

應用時區ZoneId得到ZonedDateTime

ZoneId zoneId = ZoneId.of("America/Montreal"); 
ZonedDateTime zdt = ZonedDateTime.ofInstant(instant , zoneId); 

時區VS地點

注意time zoneLocale是正交的問題。時區影響wall clock time,offset from UTCLocale隻影響演示文稿。區域設置用於(a)日語和月份的人類語言,以及(b)關於諸如月份前的月份,逗號與期間等的問題的文化規範。

例如,您可能有法語閱讀Québécois用戶在India工作時訪問您的頁面。因此,使用Asia/Kolkata的時區與Locale.CANADA_FRENCH

要生成格式化字符串,請使用DateTimeFormatter類。 Stack Overflow中已經有很多例子。通過withLocale方法指定所需的/預期的Locale

相關問題