2012-06-25 38 views
5

我在android手機(Nexus one)和java服務器之間進行時間轉換時遇到了一些麻煩。我讀過的所有東西都說它們是相同的,但是當我從我身上轉換一個長時間戳時似乎失去了1小時(正好)。Android時間vs Java時間

具體來說,如果我的Android設備,我得到了下面的輸出上運行下面的代碼

代碼:

Calendar g = Calendar.getInstance(); 
g.setTimeInMillis(1340661899000L); 
Log.d(TAG, g.getTime().toLocaleString()); 

輸出: 2012年6月25日下午6時04分59秒

我認爲這是正確的,但是當我在java服務器上運行完全相同的代碼時,我得到了同一天,但提前1小時

代碼:

Calendar g = Calendar.getInstance(); 
g.setTimeInMillis(1340661899000L); 
System.out.println(g.getTime().toLocaleString()); 

輸出: 25軍2012年下午5時04分59秒

有誰知道什麼可能會造成這個?服務器和手機都位於相同的地方(不是它應該很重要),並且服務器盒和手機上的時鐘匹配

+1

您可能不希望在客戶端和服務器之間的通信中使用本地化時間,因爲您無法確定客戶端上的時間區域設置是什麼。 –

+0

值1340661899000L不應該是當地時間,我只想顯示設備時區中的給定時間 –

+2

期望客戶端和服務器都處於相同的時區/模式,這是我建議您避免的情況。 –

回答

4

考慮到這是一個小時的差異,你可能有DST(日光節省時間)設置在服務器上而不是在電話上,反之亦然?

+0

現在,我只是覺得自己像一個白癡。 Ya出於某種原因,即使手機上的時鐘是正確的時間,toLocaleString的電話版本也沒有考慮到DST。 –

+0

@JohnS這是爲什麼你應該避免使用本地日期時間值的例子。保持你的數據通信,業務邏輯,數據存儲和服務器時鐘都在[UTC](http://en.m.wikipedia.org/wiki/Coordinated_Universal_Time)(除少數例外)。只有在數據的用戶或消費者預期時才轉換爲本地時區。 –

1

克里斯試圖說的是,你的手機和服務器可能被配置爲不同的時區。

試試打印cal.getTimeZone()的結果。如果這是您希望選擇用於通信的時區的問題。例如:

Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT+0")); 

根據日曆實例使用報告的默認時區由JavaDoc中:

TimeZone.getDefault() 

儘管您的服務器和移動被設置爲相同的時區可能並不一定意味着它們使用相同的默認TimeZone。