日期格式化程序未正确格式化日期

时间:2010-10-21 17:14:40

标签: java datetime date simpledateformat

我在以下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但是在这个for-matter输出中它给出8作为输出。请指出我在哪里做错了。我对java的日期/日历类不是很熟悉,所以请耐心等待。

4 个答案:

答案 0 :(得分:7)

月份从0开始,你传入7以便解析为8月。

来自java.util.Date的api文档:

  

月份由0到11之间的整数表示; 0是1月,1是2月,依此类推;因此11月是12月。

将月份从零开始是非常违反直觉的。我想我们在某些时候都被那个人烧了。

答案 1 :(得分:2)

Java中的month字段基于零。 GregorianCalendar.JANUARY是0 ...等等。 因此,如果要将日期传递给构造函数,请在月份值中添加一个。

如果您查看[JavaDoc here] [1],它会为您解释。

[1]:http://download.oracle.com/javase/1.4.2/docs/api/java/util/Calendar.html#set(int,int,int)

答案 2 :(得分:2)

人类喜欢将第一个月(1月)视为1,这就是SimpleDateFormat所做的。

然而,计算机喜欢看从0开始的事情,这就是GregorianCalendar管理month参数的方式。请参阅constructors for GregorianCalendarmonth参数的说明。

答案 3 :(得分:1)

[Java考虑1月份0]。[1]但是当您使用SimpleDateFormat输出月份数时,它使用标准的1月是1月系统。因此第7个月输出为8。

如果您在使用Joda Time时遇到JDK日期和日历的问题,那就更容易了

[1]:http://download.oracle.com/javase/1.4.2/docs/api/java/util/GregorianCalendar.html#GregorianCalendar(int,int,int)