3

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

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

4 回答 4

7

月份是从 0 开始的,因此在您的示例中,c1 是 2 月 31 日,这被解释为 3 月 3 日(2 月只有 28 天),而 c2 是 3 月 1 日。

于 2013-02-01T11:29:23.160 回答
5

这段代码:

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

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

来自以下文档Calendar.set

month - 用于设置 MONTH 日历字段的值。月份值从 0 开始。例如,0 表示一月。

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

作为替代方案,我强烈建议您尽可能使用Joda Time——它是一个明智的API。

于 2013-02-01T11:29:32.693 回答
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);
于 2013-02-01T16:24:21.207 回答
0

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

c1.set(2013, (01-1), 31, 16, 44, 49);
c2.set(2013, (02-1), 01, 12, 59, 55);
于 2013-02-01T13:35:22.850 回答