2016-07-05 66 views
0

我在數據庫中的數據在UTC時區和客戶端上的一些特定於時區的邏輯。在春天設置每個請求的時區

有一個從服務器在用戶的時區返回數據的決定,所以有流程:

  1. 客戶端檢測到用戶的時區通過javascript
  2. 將其發送在自定義首部(即"X-TIMEZONE"
  3. 服務器截取請求(在Filter)和設置當前時區爲它(每個請求)
  4. 服務器處理的轉換和數據返回給用戶在他的時區

所以問題是設置請求範圍的時區,它甚至有可能嗎?

我發現Timezone.setDefault()設置一般應用程序的時區。

謝謝。

+0

將時區存儲在請求範圍內的Spring bean中,並在必要時使用它(使用日期和時間時)。在JVM中設置請求範圍的時區是不可能的,因爲JVM本身並不知道任何有關範圍的知識。 – Jesper

+0

在Java8中有一個類ZonedDateTime。您可以將區域傳遞給dao並在其中創建分區日期時間。 – Damian0o

+0

實際上,'TimeZone.setDefault'會影響在該JVM中運行的所有應用*的所有線程。這樣做只能作爲最後的手段。而是傳遞一個代表所需時區的對象,並在可選時區參數中使用它。 –

回答

1

希望我正確理解你的問題。幾周前我遇到了類似的問題,這是我的解決方案。我的代碼被託管在UTC時間,因此如果您的代碼沒有託管在那裏,您可以使用Calendar time = Calendar.getInstance(TimeZone.getTimeZone("UTC"));來實現UTC。我傳入的可變時區只是我想要的目標時區。這基本上是增加或減少毫秒來根據你想要的時區轉換時間。時間的日曆對象應該是你正在尋找的時間。

Calendar time = Calendar.getInstance(); 
time.setTime(date); 
TimeZone localTimeZone = TimeZone.getTimeZone(timezone); 
int offSet = localTimeZone.getOffset(date.getTime()); 
time.set(Calendar.MILLISECOND, time.get(Calendar.MILLISECOND) + offSet); 

在此鏈接中您可以找到有效的時區選項列表。 http://tutorials.jenkov.com/java-date-time/java-util-timezone.html

+0

這是一個糟糕的做法。你不應該爲自己計算抵消調整。讓日期 - 時間類做實際的計算和調整。 Aldo,你正在使用被java.time取代的舊麻煩類。 –

0

您可以嘗試檢測客戶端的時區。但最終確定用戶所需時區的唯一可靠方法是詢問她/他。

TimeZone.setDefault影響所有所有線程中的所有代碼全部在該JVM中運行的應用程序。這樣做只能作爲最後的手段。而是傳遞一個代表所需時區的對象,並在可選時區參數中使用它。

與最早版本的Java捆綁在一起的麻煩的舊日期時間類已被Java 8及更高版本中內置的java.time類取代。大部分功能都被移植到ThreeTen-Backport中的Java 6,並進一步適用於ThreeTenABP中的Android。

以UTC獲取當前時刻。

Instant instant = Instant.now(); 

應用時區以獲得ZonedDateTime

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

要創建一個代表值,調用toString或使用DateTimeFormatter一個字符串。搜索堆棧溢出有很多例子。