2015-05-19 79 views
-1

我正在從格式爲MM/dd/yyyy hh:mm a z的DB中讀取時間現在我想在用戶本地時區顯示這個時間。所以我的問題是:在Java中的時區之間進行轉換

  1. 應該在哪裏做客戶端或服務器端?
  2. 爲了這個目的,在lib中是否構建?

UPDATE 所以我決定做服務器的轉換,因此,我有方法定義爲與服務器和時區的客戶端時間偏移參數日期之後。

public String convertToLocalDateTime(Date dateFromDB, Integer offSetMins) { 
    //1. dbDateInUTC = Convert dateFromDB to UTC 
    //2. return offSetMins + dbDateInUTC; 
} 

我不知道我該怎麼做第(1)步。任何建議?

+2

數據庫中存儲的時間如何?作爲與時區領域的時間?你如何在你的Java代碼中檢索它(作爲什麼類型)? – assylias

+2

準確地說,「客戶端」是什麼意思?這裏的客戶是什麼? –

+0

從數據庫中讀取日期後,它會自動轉換爲服務器本地時間。所以它應該準備好在服務器時區顯示。對於用戶,您可以在發送日期之前將時間轉換爲用戶區域,但您需要知道用戶時區。您可以檢查用戶請求是否有可用的信息。如果它不可用,請將您的時間與您的時區一起發送給用戶進行轉換。 – MaxZoom

回答

1

爲了確保用戶獲得它的時區,您可以在客戶端執行此操作,爲此,您可以使用庫如Moment.jsdate.js

剛剛獲得服務器的日期,改造它長:

Date d = // date from server 
long milliseconds = d.getTime(); 

發送到客戶端,並得到補償:

的時區偏移量的區別,以分鐘爲單位,在UTC和當地時間之間。請注意,這意味着如果本地時區在UTC之後,則偏移量爲正值,如果超前,則爲負值。例如,如果您的時區爲UTC + 10(澳大利亞東部標準時間),則會返回-600。即使對於給定的語言環境,夏時制也可以防止該值成爲常量。

var offset = new Date().getTimezoneOffset(); 

然後你只需要得到正確的日期1分鐘= 60.000毫秒

var dateInMilliseconds = dateFromServer - (offset * 60000); 

此外,如果作爲@jon建議要做到這一點,告訴服務器客戶端的時區,得到offset並將它發送給java來轉換日期:

long offsetMillis = offset * 60000; 
Date d = new Date(offsetMillis); 
+2

那麼,或者告訴服務器時區...這裏有各種選項。 –

+0

同意,...更新了答案...謝謝@jon –

+0

OP詢問Java。你爲什麼在談論Javascript庫? – b4hand

1

在我的實踐中,爲了避免共享和混淆,最好是:

  1. 對於在應用程序內使用UTC時區來操作和保留日期。
  2. 使用本地時區向最終用戶顯示日期/時間。

因此,服務器端所有日期/時間在UTC和客戶端在本地TZ。

+1

加一。如果您在UTC下降GMT,則更好。 – Bathsheba

相關問題