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的日期/日历类不是很熟悉,所以请多多包涵。

4

4 回答 4

7

月份是从 0 开始的,您传入 7 以便解析到 8 月。

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

一个月用 0 到 11 的整数表示;0 是一月,1 是二月,以此类推;因此 11 是 12 月。

使月份从零开始确实违反直觉。我想我们都在某个时候被那个烧伤了。

于 2010-10-21T17:17:30.190 回答
2

Java 中的月份字段是从零开始的。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)

于 2010-10-21T17:17:50.110 回答
2

人类喜欢看到第一个月(一月)是 1,所以就是SimpleDateFormat这样。

但是计算机喜欢从 0 开始看东西,这就是GregorianCalendar管理month参数的方式。请参阅GregorianCalendar 的构造函数和参数的描述month

于 2010-10-21T17:18:19.330 回答
1

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

如果您对 JDK 的日期和日历有疑问,请考虑使用Joda Time,这会容易得多

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

于 2010-10-21T17:18:35.223 回答