我在以下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的日期/日历类不是很熟悉,所以请耐心等待。
答案 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 GregorianCalendar和month
参数的说明。
答案 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)