Java getTimeInMillis()为相同的日期返回不同的值
我想我没有正确理解Java getTimeInMillis()为相同的日期返回不同的值,java,date,datetime,calendar,timestamp,Java,Date,Datetime,Calendar,Timestamp,我想我没有正确理解getTimeInMillis()。我一直认为毫秒时间戳代表一个日期,但就我而言,它让我有了不同的想法。在这里,我使用一种方法向数组添加时间戳,如下所示: Calendar date = Calendar.getInstance(); date.set(2015, 9, 25, 12, 0); timeArray.push(date.getTimeInMillis()); 在代码的其他部分,我在同一天也在做同样的事情: Calendar date2 = Calendar.ge
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()
方法是错误的?如果是这样的话,我怎样才能以其他方式实现我想做的事情呢?让我们看看。因此,根据
set
方法的文档:
设置日历字段“年”、“月”、“月中的日”的值,
每天的小时和分钟保留其他字段以前的值。
如果不需要,请首先调用clear()
所以解决方法应该很简单:只需先调用clear()
方法。让我们看看。因此,根据
set
方法的文档:
设置日历字段“年”、“月”、“月中的日”的值,
每天的小时和分钟保留其他字段以前的值。
如果不需要,请首先调用clear()
所以解决方法应该很简单:只需先调用clear()
方法。不可变对象
答案是正确的。这说明了旧日期时间类高度可变所带来的问题。相比之下,替代品、和都使用。在这种模式中,新对象是基于原始对象实例化的,而不是对原始对象进行修改
java.time
下面是java.time中自Java8起的一些示例代码。是UTC时间线上的一个时刻,而是调整为时区()的一个瞬间
构建一个zoneDateTime
逐块:,区域
首先访问ZonedDateTime
中的Instant
,从历元中提取毫秒数
Instant instant = zdt.toInstant ();
long millisecondsSinceEpoch = instant.toEpochMilli (); // WARNING: Data loss. The java.time types have nanosecond resolution.
往另一个方向走注意:这可能会导致数据丢失。time框架使用9位小数秒的分辨率。只有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地区ID:美国/蒙特利尔是2015-09-25T12:00-04:00[美国/蒙特利尔],自纪元起毫秒数:1443196800000
不变对象
答案是正确的。这说明了旧日期时间类高度可变所带来的问题。相比之下,替代品、和都使用。在这种模式中,新对象是基于原始对象实例化的,而不是对原始对象进行修改
java.time
下面是java.time中自Java8起的一些示例代码。是UTC时间线上的一个时刻,而是调整为时区()的一个瞬间
构建一个zoneDateTime
逐块:,区域
首先访问ZonedDateTime
中的Instant
,从历元中提取毫秒数
Instant instant = zdt.toInstant ();
long millisecondsSinceEpoch = instant.toEpochMilli (); // WARNING: Data loss. The java.time types have nanosecond resolution.
往另一个方向走注意:这可能会导致数据丢失。time框架使用9位小数秒的分辨率。只有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地区ID:美国/蒙特利尔是2015-09-25T12:00-04:00[美国/蒙特利尔],自纪元起毫秒数:1443196800000
什么是
timeArray
?你试过使用.equals
替代吗?@MadProgrammertimeArray
是long
类型的ArrayList
,我想我做的比较是正确的。问题是,当我遍历数组项时,我可以看到相同日期的毫秒数不同。啊,你知道问题更可能是什么,Calendar.set(int,int,int,int,int)
不更改秒或毫秒值,“保留其他字段以前的值。如果不需要,请先调用clear()”@MadProgrammer,因为我要查找的答案存在于您的注释中,如果您愿意,请将其作为实际答案,以便我可以选择正确的答案。没关系,蒂莫菲回答了我几乎要说的一切;)什么是timeArray
?你试过使用.equals
替代吗?@MadProgrammertimeArray
是long
类型的ArrayList
,我想我做的比较是正确的。问题是,当我遍历数组项时,我可以看到相同日期的毫秒数不同。啊,你知道问题更可能是什么,Calendar.set(int,int,int,int,int)
不更改秒或毫秒值,“保留其他字段以前的值。如果不需要,请先调用clear()”@MadProgrammer,因为我要查找的答案存在于您的注释中,如果您愿意,请将其作为实际答案,以便我可以选择正确的答案。没关系,蒂莫菲回答了我几乎要说的一切;)其他字段的先前值将保留。但在OP的例子中,date2
是一个新对象。。。它的时间以前从未设定过。OP的问题似乎是在OP的代码段中从未指定秒/毫秒,因此它们没有定义。之所以clear
起作用,是因为将所有时间字段的值清除为0
(无论如何,在我的系统上),因此秒/毫秒不是未定义的。但是将它们设置为0并不是清除
的记录行为,因为它的文档中说设置了所有日历字段值和未定义的此日历的时间值。其他字段的先前值将保留。但在OP的例子中,date2
是一个新对象。。。它的时间以前从未设定过。OP的问题似乎是在OP的snippe中从未指定秒/毫秒