首页 文章

getTimeInMillis()为相同的日期返回不同的值

提问于
浏览
1

我想我不理解 getTimeInMillis() . 我've always thought that a milliseconds timestamp represents one date, but on my case, it made me think different. Here, I'm使用方法向数组添加时间戳,如下所示:

Calendar date = Calendar.getInstance();
date.set(2015, 9, 25, 12, 0);
timeArray.push(date.getTimeInMillis());

在代码的其他部分,我在相同的日期做同样的事情:

Calendar date2 = Calendar.getInstance();
date2.set(2015, 9, 25, 12, 0);

不幸的是,这种比较返回false:

timeArray.get(0) == date2.getTimeInMillis();

难道't those two values be true? Or maybe I' ve了解 getTimeInMillis() 方法错了吗?如果是这样,我怎样才能以其他方式实现我想要做的事情呢?

2 回答

  • 1

    我们来看看documenation .
    所以根据 set 方法的文件:

    设置日历字段YEAR,MONTH,DAY_OF_MONTH,HOUR_OF_DAY和MINUTE的值 . 保留其他字段的先前值 . 如果不需要,请先调用clear() .

    所以修复应该很简单:首先调用 clear() 方法 .

  • 5

    不可变对象

    Answer by Timofey是正确的 . 这表明旧的日期时间类具有高度可变性的问题 . 相比之下,替代品java.timeJoda-Time都使用immutable objects . 在此模式中,基于原始对象实例化新鲜的新对象,而不是改变原始对象 .

    java.time

    以下是Java 8中Java 8时代的一些示例代码.Instant是UTC时间轴上的一个时刻,而ZonedDateTime是调整为时区的瞬间(ZoneId) .

    逐件构建 ZonedDateTimedatetime,zone .

    LocalDate datePortion = LocalDate.of ( 2015 , 9 , 25 );
    LocalTime timePortion = LocalTime.NOON;
    ZoneId zoneId = ZoneId.of ( "America/Montreal" );
    ZonedDateTime zdt = ZonedDateTime.of ( datePortion , timePortion , zoneId );
    

    通过首先访问 ZonedDateTime 内的 Instant 来提取从纪元开始的毫秒数 .

    Instant instant = zdt.toInstant ();
    long millisecondsSinceEpoch = instant.toEpochMilli ();  // WARNING: Data loss. The java.time types have nanosecond resolution.
    

    走向另一个方向 . BEWARE: 这涉及可能的数据丢失 . java.time框架使用nanoseconds的分辨率,小数秒的9位数 . Milliseconds只是小数秒的3位数 .

    Instant instantFromMillis = Instant.ofEpochMilli ( millisecondsSinceEpoch );
    

    转储到控制台 .

    System.out.println ( "Date: " + datePortion + " Time: " + timePortion + " in zoneId: " + zoneId + " is " + zdt + " with milliseconds since epoch: " + millisecondsSinceEpoch );
    

    跑步时

    日期:2015-09-25时间:12:00在zoneId:美国/蒙特利尔是2015-09-25T12:00-04:00 [美国/蒙特利尔],自纪元以来毫秒:1443196800000

相关问题