我想我不能正确理解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()
方法错了?如果是这样,我怎样才能以其他方式实现我想要做的事情呢?
答案 0 :(得分:5)
我们来看看documenation
所以根据set
方法的文件:
设置日历字段YEAR,MONTH,DAY_OF_MONTH的值, HOUR_OF_DAY和MINUTE。 保留其他字段的先前值。 如果不需要,请先调用clear()。
所以修复应该很简单:首先调用clear()
方法。
答案 1 :(得分:1)
Answer Timofey是正确的。这表明旧的日期时间类具有高度可变性的问题。相反,替代方案java.time和Joda-Time都使用immutable objects。在这种模式中,新的新对象基于原始对象进行实例化,而不是改变原始对象。
以下是Java 8中Java 8时代的一些示例代码。Instant
是时间轴上的一个时刻,而ZonedDateTime
是一个瞬时调整为时区(ZoneId
})。
逐件构建ZonedDateTime
:date,time,区域。
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