2014-02-08 21 views
1

我需要的是特定時區(「俄羅斯/莫斯科」)和用戶本地時間之間的時差,差異應以小時爲單位。安卓時區差異小於1小時

我遇到了時差的差異有時會被錯誤計算的問題。我計算出android設備的本地偏移量與UTC的偏移量(以小時爲單位),以及遠程偏移到UTC。對於大多數用戶來說很好..但很多用戶抱怨這個問題..我無法在我的手機或模擬器中重現它。 「錯誤」顯示的時間差異是所有方式少於1小時。 在莫斯科現在是15:00,在歐洲12:00。但用戶看到2小時的偏移量 這裏是我的代碼。

String tz="Europe/Moscow" 
Calendar mCalendar = new GregorianCalendar(); 
mCalendar.setTimeZone(TimeZone.getTimeZone(tz)); 
TimeZone mTimeZone = mCalendar.getTimeZone(); 
int remote = mTimeZone.getRawOffset()/1000/60/60; 

Calendar mCalendar2 = new GregorianCalendar(); 
TimeZone mTimeZone2 = mCalendar2.getTimeZone(); 
int local = mTimeZone2.getRawOffset()/1000/60/60; 

return local - remote; 
+0

由於「夏令時」/「夏令時」,您的時鐘每年向前/向後兩次?看看你在減法之前得到的數字。 –

+0

我不知道,因爲它不會發生在我身上。通過我的電話就可以了。這些是來自用戶的錯誤報告.. :( – user1908375

+1

莫斯科目前比倫敦早了4個小時,儘管在夏季,它將提前3小時,因爲英國在春季將時鐘向前推進一小時,其他國家也會這樣做。考慮到這一點?在抱怨用戶和不抱怨用戶之間存在一種模式?請看這些國家的時間,以及他們是否改變時鐘。 –

回答

3

您正在等同一個時區時區的常見錯誤偏移。他們是兩個不同的東西。請閱讀timezone tag wiki

當您致電getRawOffset時,返回該時區的標準偏移量。要獲得在特定時間點有效的偏移量,可以使用getOffset,該參數爲您所談論的時間點提供時間戳的參數。

考慮下面的代碼,它返回是目前生效的區別:

long now = System.currentTimeMillis(); 

String tz = "Europe/Moscow"; 
TimeZone mTimeZone = TimeZone.getTimeZone(tz); 
int remote = mTimeZone.getOffset(now); 

TimeZone mTimeZone2 = TimeZone.getDefault(); 
int local = mTimeZone2.getOffset(now); 

double differenceInHours = (local - remote)/3600000.0; 

return differenceInHours; 

注意兩件事情:

  • 我並不需要一個Calendar類。
  • 偏移量都是相同的「現在」。取決於運行時間,您會得到不同的結果。
  • 並非所有的偏移量都使用整個小時數,所以此函數應該返回double而不是int。例如,嘗試使用UTC + 5:30全年的Asia/KolkataAustralia/Adelaide,它在UTC + 9:30和UTC + 10:30之間交替。

也考慮使用Joda-Time,這是一種更加健壯的Java工作方式。