2014-10-31 45 views
4

如果我執行的GMT時區的計算機上以下日曆返回日期錯誤的時區

TimeZone timeZone = TimeZone.getTimeZone('IST'); // India Standard Time 
Calendar calendar = Calendar.getInstance(timeZone); 

System.out.println(calendar.getTime()); 

它打印

週五10月31日十五時18分22秒格林尼治標準時間2014

爲什麼在計算機的默認時區打印日期,而不是TimeZoneCalendar是用?

+0

[爲什麼日曆會在正確的時區返回錯誤的小時?](http://stackoverflow.com/questions/19299659/why-is-calendar-returning-the-wrong-hour-with正確的時區)和[this](http://stackoverflow.com/q/1516213/642706)和[this](http://stackoverflow.com/q/9410806/642706)和[this ](http://stackoverflow.com/q/14124701/642706)等等。 – 2014-11-02 01:48:46

回答

3

因爲Date對象不具有時區作爲其狀態的一部分,你需要的SimpleDateFormat格式化和打印日期在您需要的時區

0

你有打印日期/時間之前申請時區

示例: TimeZone.setDefault(TimeZone.getTimeZone(「IST」));

(代碼未測試)

0

Calendar#getTime() - 返回表示此日曆的時間值(毫秒從Epoch.To偏移是精確的一個java.util.Date內的值是自毫秒數Date對象Unix紀元,發生在午夜1970年1月1日,UTC,並java.util.Date是沒有具體的時間段。在另一方面

就可以達到你正在嘗試以這種方式也

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MMM-dd HH:mm:ss z"); 
sdf.setTimeZone(TimeZone.getTimeZone("IST")); 
System.out.println(sdf.format(new Date())); 
1

當轉換將Calendar對象轉換爲Date對象時區將丟失。日曆本身使用時區。以下內容將打印到指定的時區。

TimeZone timeZone = TimeZone.getTimeZone('IST'); // India Standard Time 
Calendar calendar = Calendar.getInstance(timeZone); 

System.out.println(calendar.get(Calendar.DAY_OF_MONTH) + "/" + 
(calendar.get(Calendar.MONTH)+1) + "/" + calendar.get(Calendar.YEAR) + " Time: " + 
calendar.get(Calendar.HOUR_OF_DAY) + ":" + calendar.get(Calendar.MINUTE)); 
System.out.println(calendar.getTime()); 

(注意不要使用日曆API,這樣,它很凌亂,使用日期格式API)

的日期API有許多問題(這就是爲什麼它在Java 8已經完全重做)。

5

Answer by Joshi正確但簡短。我會擴大一點,並展示與現代課程的另一種選擇。

Date沒有時區

你的代碼calendar.getTime()提取來自java.util.Calendar對象java.util.Date對象。

java.util.Date類有一個善意但易混淆的特性,其toString方法在生成字符串時應用JVM的當前默認時區。這產生了錯覺,即Date類沒有時區。 A Date表示自1970年UTC(1970-01-01T00:00:00Z)第一時刻的歷元參考日期以來的時間線上的時刻,作爲自毫秒的計數。 (更令人困惑的是,Date類實際上是確實有一個時間區域內部深陷,但是這個討論無法達到並且無關緊要。)

避免遺留日期時類

舊日期,時間類現在是傳統,由java.time類取代。而只使用java.time類。

Instant

對於UTC片刻,相當於java.util.Date,使用Instant類。 Instant類表示UTC中時間軸上的一個時刻,分辨率爲nanoseconds(小數點後最多九(9)位數字)。

Instant instant = Instant.now(); // Current moment in UTC. 

ZonedDateTime

要通過一個特定區域的wall-clock time的鏡頭查看同一時刻,應用ZoneId得到ZonedDateTime

continent/region的格式指定一個proper time zone name,如America/MontrealAfrica/Casablanca,或Pacific/Auckland。切勿使用3-4字母縮寫,如ESTIST,因爲它們是而不是真正的時區,不是標準化的,甚至不是唯一的(!)。

ZoneId z = ZoneId.of("Asia/Kolkata"); 
ZonedDateTime zdt = instant.atZone(z); 

關於此主題的許多其他問題和解答的搜索堆棧溢出。這個問題實際上是許多其他問題的重複。


關於java.time

java.time框架是建立在Java 8和更高版本。這些類取代了日期時間類legacy,如java.util.Date,Calendar,& SimpleDateFormat

Joda-Time項目現在位於maintenance mode,建議遷移到java.time類。請參閱Oracle Tutorial。並搜索堆棧溢出了很多例子和解釋。規格是JSR 310

從何處獲取java.time類?

ThreeTen-Extra項目與其他類擴展java.time。這個項目是未來可能增加java.time的一個試驗場。您可以在這裏找到一些有用的類,如Interval,YearWeek,YearQuartermore