2010-10-21 204 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