将日期转换为毫秒,给出错误的结果

时间:2013-02-01 11:26:39

标签: java date

我想将两个日期转换为毫秒,但是给定的结果是错误的,代码有什么问题吗?如何解决呢?

GregorianCalendar c1 = new GregorianCalendar();
GregorianCalendar c2 = new GregorianCalendar();

c1.set(2013, 01, 31, 16, 44, 49);
c2.set(2013, 02, 01, 12, 59, 55);

System.out.println("c1 = "+c1.getTimeInMillis()+"\nc2 = "+ c2.getTimeInMillis());

output:
c1 = 1362300289619
c2 = 1362113995619

计算完时间后,结果为:0Month -2Day -3Hour -44Min -54Sec 这是错的。必须是这样的:0Month 0Day 20Hour 15Min 6Sec

c1比c2大,因为它给出了错误的结果,但是为什么c1变得大于c2,在这种情况下,不可能计算两个日期之间的时间。 如果有人知道,请提前帮助我。

4 个答案:

答案 0 :(得分:8)

月份是0,所以在你的例子中,c1是2月31日,被解释为3月3日(2月只有28天),c2是3月1日。

答案 1 :(得分:5)

此代码:

c1.set(2013, 01, 31, 16, 44, 49);

正在尝试设置 February 31,因为Java月份是从0开始的。我怀疑你最终会在2月28日3天后的3月3日结束。这显然是在3月1日之后,这是你的c2所设定的。

来自Calendar.set的文档:

  

month - 用于设置MONTH日历字段的值。月值基于0。例如,1月份为0。

每当您发现代码行为异常时,总是检查您不是100%确定的任何API调用的详细信息。

作为替代方案,我强烈建议您尽可能使用Joda Time - 这是一个很多 saner API。

答案 2 :(得分:1)

  

谢谢你们的回复!现在问题解决了,只有   从几个月减去1,之前我不知道Java中的几个月   从零开始......这是如何解决

     

c1.set(2013,(01-1),31,16,44,49);
     c2.set(2013,(02-1),01,12,59,55);

相反,您可以使用java.util.Calendar类上的常量,这将使您的代码更易于阅读。

c1.set(2013, Calendar.JANUARY, 31, 16, 44, 49);
c2.set(2013, Calendar.FEBRUARY, 01, 12, 59, 55);

答案 3 :(得分:0)

谢谢你们的回复! 这个问题现在解决了,只是从几个月减去1,之前我不知道在Java中几个月从零开始...... 这是如何解决的:

c1.set(2013, (01-1), 31, 16, 44, 49);
c2.set(2013, (02-1), 01, 12, 59, 55);