我想将两个日期转换为毫秒,但是给定的结果是错误的,代码有什么问题吗?如何解决呢?
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,在这种情况下,不可能计算两个日期之间的时间。 如果有人知道,请提前帮助我。
答案 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);