2016-09-28 57 views
0

請看看我的代碼如下:的Java Calendar.getInstance()更改默認的時區中的Linux

SimpleDateFormat sd = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); 
Calendar calendar = Calendar.getInstance(); 
calendar.set(Calendar.HOUR_OF_DAY, 0); 
calendar.set(Calendar.MINUTE, 0); 
calendar.set(Calendar.SECOND, 0); 
calendar.set(Calendar.MILLISECOND, 0); 
sd.setTimeZone(TimeZone.getTimeZone("GMT")); 
System.out.println(sd.format(calendar.getTime())); 

我的Windows系統的默認時區是EDT在這個時刻和時間,當我跑這個代碼是(28/09/2016下午12點27分),當我運行此代碼在系統的輸出,我得到如下 - 其目的是(美國東部時間爲GMT轉換):

28/09/2016 04:00:00 

但是當我在服務器上運行此(紅帽企業Linux服務器版本5.11)輸出我得到如下:

28/09/2016 00:00:00 

當我運行下面的命令來對Linux shell

date +%Z 

它返回下面的輸出

EDT 

所以,我無法理解爲什麼轉換並沒有發生。另外,我有一段代碼象下面這樣:

SimpleDateFormat sd = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); 
Calendar calendar = Calendar.getInstance(); 
sd.setTimeZone(TimeZone.getTimeZone("GMT")); 
System.out.println(sd.format(calendar.getTime())); 

低於輸出,返回(RAN它28/09/2016 12:36)相同的Linux服務器與預期輸出,它轉化爲GMT

28/09/2016 16:36:46 

此代碼是在WebLogic 12c上運行的J2EE應用程序的一部分。如果您有任何線索,請分享,可能會導致上述情況。謝謝。

+0

如果我沒有記錯,存在startWeblogic設置(或類似的,它已經好幾年,因爲我用的WebLogic),以覆蓋系統的時區,使用GMT(默認)。你可以通過在某處記錄'Calendar.getInstance()。getTimeZone()。toString()來驗證。 –

+0

@ElliottFrisch我檢查了一下,並且它返回了GMT,但我不確定第二段代碼如何工作,它不應該轉換。 –

+0

無法用提供的代碼重現問題。你是否向我們展示了真實的代碼或類似於真實代碼的代碼? –

回答

0

您依靠的是默認時區。指定兩個時區,並且轉換應該工作。

28/09/2016 12:27:00 -> 28/09/2016 16:27:00 +0000 

這裏是一些測試代碼。

package com.ggl.testing; 

import java.text.ParseException; 
import java.text.SimpleDateFormat; 
import java.util.Date; 
import java.util.TimeZone; 

public class TimeZoneConversion { 

    public static void main(String[] args) { 
     SimpleDateFormat sdInput = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); 
     sdInput.setTimeZone(TimeZone.getTimeZone("US/Eastern")); 
     SimpleDateFormat sdOutput = new SimpleDateFormat(
       "dd/MM/yyyy HH:mm:ss Z"); 
     sdOutput.setTimeZone(TimeZone.getTimeZone("GMT")); 

     try { 
      String dateString = "28/09/2016 12:27:00"; 
      Date inputDate = sdInput.parse(dateString); 
      System.out 
        .println(dateString + " -> " + sdOutput.format(inputDate)); 
     } catch (ParseException e) { 
      e.printStackTrace(); 
     } 

    } 

} 
+0

感謝@GilbertLeBlanc的輸入。你是對的,因爲WebLogic配置覆蓋了默認的時區,SimpleDateFormat使用相同的時區進行轉換,所以依靠默認的系統時區是一個錯誤。所以,在SimpleDateFormat中添加了明確的時區。 –