[英]Database datetime to java.util.Date conversion with timezone
我的任務是將存儲在我的DB(Sql Server)表的列之一上的時間轉換為指定的時區。 該列始終包含UTC時區中的時間。
我面臨的問題是,當休眠模式讀取列並將其設置為我的實體類時,它將在應用程序服務器的時區中設置時間。
例如:如果DB具有值-2012年7月7日10:30(實際上是UTC),則休眠將映射的日期字段設置為PST 2012年7月7日10:30(假設JVM在PST上運行)。
現在,如果此日期轉換為任何其他時區..比如格林尼治標准時間+5:30,我會得到意外的結果
為了解決上述問題...我編寫了以下代碼
//Reading the DB time (which does not have timezone info)
Date dbDate = entityObj.getDBUtcDate();
//Setting GMT timezone to the date, without modifying the date
Calendar c = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
c.set(dbDate.getYear(), dbDate.getMonth(), dbDate.getDate()..., dbDate.getMinutes());
Date utcDate = c.getTime();
使用上面的代碼。我可以將數據庫存儲的日期恢復為UTC時區,但是當我使用以下邏輯轉換為其他時區(例如GMT + 5:30)時
Calendar outCal = Calendar.getInstance(TimeZone.getTimeZone("GMT+5:30"));
outCal.setTimeInMillis(utcDate.getTime());
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, outCal.get(Calendar.YEAR));
cal.set(Calendar.MONTH, outCal.get(Calendar.MONTH));
cal.set(Calendar.DAY_OF_MONTH, outCal.get(Calendar.DAY_OF_MONTH));
cal.set(Calendar.HOUR_OF_DAY, outCal.get(Calendar.HOUR_OF_DAY));
cal.set(Calendar.MINUTE, outCal.get(Calendar.MINUTE));
cal.set(Calendar.SECOND, outCal.get(Calendar.SECOND));
cal.set(Calendar.MILLISECOND, outCal.get(Calendar.MILLISECOND));
//Converted date
Date pstTime = cal.getTime();
//Converted time mill seconds
long timeMilSec = pstTime.getTime();
轉換日期的時間毫秒開始為負數(-54672 ...),這似乎表示一個無效時間。
我的問題是如何從數據庫還原時區信息(而不必在數據庫中有任何額外的列來專門存儲時區信息)?
要么
如何將數據庫時間轉換為具有指定時區(UTC)的時間?
PS:我希望以java.util.Date/ Calendar的形式輸出,因為我需要在該日期再進行一次轉換
請幫我解決這個問題
Java中的日期沒有時區。 它們只是時間上的普遍時刻。 如果要顯示給定時區中的日期,則只需使用以該時區初始化的DateFormat:
DateFormat df = DateFormat.getInstance();
df.setTimeZone(TimeZone.getTimeZone("UTC"));
System.out.println("The date in the database, in the UTC time zone, is "
+ df.format(date));
您無需進行任何轉換。 日期格式根據其格式的通用瞬間以及您要使用的時區來打印適當的值。
同樣,如果您想知道日期是星期一還是星期二,或者是1點或2點,則需要先選擇一個時區,將其轉換為Calendar,然后向日歷詢問信息:
Calendar cal = Calendar.getInstance(someTimeZone);
cal.setTime(date);
System.out.println("The day for the date stored in the database, for the time zone "
+ someTimeZone
+ " is " + cal.get(Calendar.DATE));
旁注:請勿使用不建議使用的方法。 他們被淘汰是有充分理由的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.