在Android (Java)中将日期转换为毫秒数会产生不一致的结果

4

我正在尝试在Android上使用日历,但当我尝试将日期转换为毫秒时,每次运行时我得到不同的结果。

当我打印出milliseconds1和milliseconds2的值时,每次都得到不同的结果!

我的代码如下:

Calendar calendar1 = Calendar.getInstance();
Calendar calendar2 = new GregorianCalendar(TimeZone.getTimeZone("GMT"));

calendar1.set(1997, 9, 3);
calendar2.set(1997, 9, 01);

long milliseconds1 = calendar1.getTimeInMillis();
long milliseconds2 = calendar2.getTimeInMillis();

这是Java(或Android实现)的一个bug,还是类似于这样的问题?

请提供您所提到的不同输出。 - Naveen Babu
我对此并不是非常小心。我只是试图看看能否让任何东西工作。谢谢。 - Shdus
当然。我运行它一次得到875693736417。第二次我得到875693771063。第三次我得到875694175657。以此类推。 - Shdus
1个回答

10

你的问题的答案是:,这不是Java或Android中的bug。这是有很好的文档记录的行为。一个Calendar实例有比YEAR、MONTH和DATE更多的字段。你需要生成新的日历实例,并只更改那些字段,使所有其他字段保持创建时的状态不变。如果你连续运行程序两次,秒数和毫秒数会在这段时间内改变。

JavaDoc中可以看到:

设置日历字段YEAR、MONTH和DAY_OF_MONTH的值。保留其他日历字段的原来值。如果不想保留原来值,要先调用clear()方法。

为了每次打印相同的值,您需要做到这一点:

    Calendar calendar1 = Calendar.getInstance();
    Calendar calendar2 = new GregorianCalendar(TimeZone.getTimeZone("GMT"));

    calendar1.clear();
    calendar1.set(1997, 9, 3);
    calendar2.clear();
    calendar2.set(1997, 9, 1);

    long milliseconds1 = calendar1.getTimeInMillis();
    long milliseconds2 = calendar2.getTimeInMillis();

哦,谢谢!我完全没注意到。 - Shdus
1
@Shdus 如果你看到了意料之外的行为,请仔细阅读Javadoc。 - Mark Rotteveel
@Shdus - 在你发布一个SO问题之前,先做好功课... :-) - Stephen C
疯狂但真实! - Mobigital

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接