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

时间:2015-10-25 23:11:04

标签: java date datetime calendar timestamp

我想我不能正确理解getTimeInMillis()。我一直以为毫秒时间戳代表一个日期,但就我而言,它让我有所不同。在这里,我使用一种方法向数组添加时间戳,如下所示:

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();

这两个值不应该是真的吗?或者我可能已经理解getTimeInMillis()方法错了?如果是这样,我怎样才能以其他方式实现我想要做的事情呢?

2 个答案:

答案 0 :(得分:5)

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

  

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

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

答案 1 :(得分:1)

不可变对象

Answer Timofey是正确的。这表明旧的日期时间类具有高度可变性的问题。相反,替代方案java.timeJoda-Time都使用immutable objects。在这种模式中,新的新对象基于原始对象进行实例化,而不是改变原始对象。

java.time

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

逐件构建ZonedDateTimedatetime,区域。

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

首先访问Instant内的ZonedDateTime,从时间上提取毫秒。

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

走向另一个方向。 当心:这可能导致数据丢失。 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