2013-02-01 60 views
1

在上面的代碼中,我想通過服務器的時區(GMT-02:00)將日期從我的設備(GMT-03:00)轉換爲TimeZone。 但我總是有相同的服務器日期。我做錯了什麼?由TimeZone轉換日期

TimeZone timeZoneServer = TimeZone.getTimeZone(timeZoneServerString); Long time = new Long(Long.valueOf(timeInMilis));

 Calendar calendarDateServer = Calendar.getInstance(timeZoneServer); 
     calendarDateServer.setTimeInMillis(time); 
     long miliServer = calendarDateServer.getTimeInMillis(); 

     TimeZone timeZoneMeu = TimeZone.getDefault(); 
     Calendar meuCalendario = new GregorianCalendar(); 
     meuCalendario.setTimeZone(timeZoneMeu); 

     meuCalendario.setTimeInMillis(miliServer); 
     Date transformedDate = meuCalendario.getTime(); 


     return transformedDate; 

回答

4

我做錯了什麼?

你假設一個Date有一個開始的時區。它沒有。 A Calendar確實,但Date只是毫秒以來的Unix時代。它不知道日曆系統或時區。這只是一個時間點。

目前尚不清楚你想要的結果做什麼 - 但如果它的格式化顯示的問題,只需使用SimpleDateFormat和設置時區上代替。

我也強烈建議您使用Joda Time,而不是內建類型...這是一個更明智的API。

+0

謝謝Jon Skeet。我不知道Java的對象日期只是忽略時區。 – leonvian

0

java.time

的Java 8,後來有java.time框架內置。受JSR 310定義的Joda-Time的啓發,並由ThreeTen-Extra項目擴展。這些新的java.time類取代了與最早版本的Java(java.util.Date/.Calendar)捆綁在一起的衆所周知的麻煩的舊日期時間類。

java.time的基礎知識... InstantUTC中時間軸上的一個時刻。應用時區(ZoneId)獲得ZonedDateTime。您的示例代碼僅使用offset-from-UTC。時區是一個偏移量關於調整諸如夏令時(DST)等異常的一組規則。因此儘可能使用proper time zone name。但如果不可能,請使用ZoneOffset獲得OffsetDateTime

順便說一下,一般的最佳做法是保持您的服務器在UTC。但那是另一個討論。

首先從服務器獲取當前日期時間。

Instant now = Instant.now(); // UTC. 
ZoneOffset offsetServer = ZoneOffset.of ("-02:00"); // Or ZoneOffset.systemDefault() 
OffsetDateTime odtServer = OffsetDateTime.ofInstant(instant , offsetServer); 

或者,我們可以縮短,爲:

ZoneOffset offsetServer = ZoneOffset.of ("-02:00"); // Or ZoneOffset.systemDefault() 
OffsetDateTime odtServer = OffsetDateTime.now (offsetServer); 

定義所需的偏移。將該偏移量應用於服務器的當前日期時間進行調整。

ZoneOffset offsetDesired = ZoneOffset.of ("-03:00"); 
OffsetDateTime odtDesired = odtServer.withOffsetSameInstant (offsetDesired); 

轉儲到控制檯。

System.out.println ("instant: " + instant + " | odtServer: " + odtServer + " | odtDesired: " + odtDesired); 

瞬間:2016-01-22T22:16:14.386Z | odtServer:2016-01-22T20:16:14.386-02:00 | odtDesired:2016-01-22T19:16:14.386-03:00

的日期時間值的那些文本表示默認在使用ISO 8601標準toString方法格式化。您可以根據需要定義其他格式;在很多例子中搜索StackOverflow。