2010-10-21 251 views
2

我寫了下面的java代碼,以特定格式格式化日期和時間。你可以在ideone看到下面的代碼。日期格式化程序沒有正確格式化日期

import java.util.Calendar; 
import java.util.GregorianCalendar; 
import java.text.SimpleDateFormat; 
class timeAndDateTransformation{ 
    public static void main(String[] argv){ 
      Calendar newDate = new GregorianCalendar(2009,7,1,15,20,00); 
      SimpleDateFormat dateFormant = new SimpleDateFormat("yyyy/MM/dd"); 
      SimpleDateFormat timeFormant = new SimpleDateFormat("HH:mm:ss"); 
      System.out.println(dateFormant.format(newDate.getTime()).toString()); 
      System.out.println(timeFormant.format(newDate.getTime()).toString()); 
    } 

}

它給我下面的輸出:

2009/08/01 
15:20:00 

在此輸出,其餘全部是完全沒問題,除了一個月。我作爲一個月通過7,但在這個事情輸出它給8輸出。請指出我在哪裏做錯了。我不是很熟悉java的日期/日曆類,所以請耐心等待。

回答

7

幾個月是基於0的,你在7年通過,以便解決到八月。

從API文檔java.util.Date:

一個月由從0到11的整數表示; 0是1月,1是2月,等等;因此11月是12月。

使月份爲零爲基礎確實是違反直覺的。我想我們在某個時候被所有人燒燬了。

+0

啊..有沒有人知道它背後的任何具體原因,因爲幾天它是1-31.In日期/時間元素只有一天從1開始,其餘都是零基於,所以更具體的問題可能是,爲什麼他們沒有設計日子也開始從0-30 :)? – 2010-10-21 17:47:11

+2

您可以使用像Calendar.AUGUST這樣的內置常量來避免此問題。 – 2010-10-21 17:57:21

+0

@阿尼爾:是的,月份是唯一的基於0的字段。數年來這個數字是唯一的參考,所以從中減去一個是明顯可怕的,因爲幾個月主要是通過名稱(英語,而不是像日語這樣的一些語言)知道的,他們覺得可以更改編號。不好的決定,但。 – 2010-10-21 17:57:29

2

人類喜歡看的第一個月(1月)爲1,所以這就是SimpleDateFormat一樣。

但是計算機喜歡看到從0開始的東西,這就是GregorianCalendar管理month參數的方式。請參閱constructors for GregorianCalendar和參數month的說明。

+2

這是真的,但它很混亂,因爲月份字段是唯一的基於零的字段。 – Codemwnci 2010-10-21 17:20:48

+0

是的,我同意!我認爲,我們習慣於計算從零開始的各種事情,但幾個月幾乎都以開始。我認爲他們在設計這個課程時做出了錯誤的決定。無論如何,這是它的方式,我們無能爲力:( – 2010-10-21 17:36:52