2016-11-17 48 views
0

我使用的瀏覽器偏移時間給定時間本地時間轉換。這裏是我用來將時間從大西洋時區(-4:00)轉換爲IST的代碼。通過瀏覽器時間轉換偏移

int hours=23; 
int mins =30; 
Calendar date=Calendar.getInstance(); 
date.set(Calendar.HOUR_OF_DAY, hours); 
date.set(Calendar.MINUTE, mins); 
browserOffsetTime=-browserOffsetTime; 
TimeZone defaultTZ=TimeZone.getTimeZone("Atlantic/Bermuda"); 
int serverTimeOffset=defaultTZ.getRawOffset()+defaultTZ.getDSTSavings(); 
Date GMTDate= new Date(date.getTimeInMillis() - serverTimeOffset); 
Date userBrowserTime = new Date(GMTDate.getTime() + browserOffsetTime); 
Calendar cal1=Calendar.getInstance(); 
cal1.setTime(userBrowserTime); 

此代碼返回EST的確切結果,它是上午10:00,因爲它返回上午8:00,應該是上午9:00。

https://stackoverflow.com/a/21349556/3739916此代碼返回兩個時區確切的結果。但我需要使用瀏覽器偏移時間來解決這個問題。

+1

難道夏季儲蓄問題可以解釋一個小時的差異嗎? –

+0

@TimBiegeleisen我在沒有添加夏令時的情況下進行了檢查,結果仍然相同。 – SwethaHarshini

+0

@TimBiegeleisen對不起,我沒有立即理解你。那麼,我是否應該使用瀏覽器偏移時間進行時間轉換? – SwethaHarshini

回答

1

您正在幾個常見的錯誤:

  • 你已經有了一個固定的偏移,你從瀏覽器獲得的 - 可能通過JavaScript代碼像new Date().getTimezoneOffset()。這將是客戶端在當前日期和時間與UTC的偏移量。您不能將此偏移量應用於任何時間戳,因爲客戶端的偏移量可能會因您要求的時間點而有所不同。請參閱the timezone tag wiki中的「時區!=偏移量」,並參閱this answer瞭解如何猜測用戶的實際時區。

  • 你通過加減做了很多的時間戳和偏移的手動操作的。除非您創作日期/時間庫,否則應避免使用此類代碼。 Java有許多不錯的選擇,例如用於Java 7及更早版本的Joda-Time,以及用於Java 8及更新版本的the built-in java.time package。你應該避免使用java.util.Datejava.util.Calendar API,因爲有這些許多挑戰。

  • 當你做這樣的事情new Date(timestamp + offset) - 你是不是真正執行時區轉換。這與java.util.Date對象進行交互的一切期待的時間戳是基於Unix的時代,這是明確UTC(1970-01-01T00:00:00Z)的條款。所以如果你增加或減去一個偏移量,你只是在時間選擇不同的時間。如果您使用較新的API,則不必考慮這一點。

  • 您計算serverTimeOffset作爲基本偏移+的DST偏,但你不考慮DST是否是有效。如果您使用較新的API,則不必考慮這一點。