为了账号安全,请及时绑定邮箱和手机立即绑定

为什么日期转换会返回不同的时间戳?

为什么日期转换会返回不同的时间戳?

慕的地8271018 2023-03-31 14:43:25
我正在将 GregorianCalendar 实例转换为 Date 以获得 unix 时间戳。但我想知道为什么相同的日期每次都返回不同的 Unix 时间戳。SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");Calendar calendar = new GregorianCalendar();calendar.set(2018, 0, 1, 0,0,0);System.out.println(sdf.format(calendar.getTime()));Date date = calendar.getTime();System.out.println(sdf.format(date));System.out.println(date.getTime());日期本身是正确的,并且始终相同,"2018/01/01 00:00:00"。但是为什么每次的unix时间戳都不一样呢?例如,这些是 5 次执行后的值。15147612006241514761200618151476120079715147612002091514761200132
查看完整描述

4 回答

?
红糖糍粑

TA贡献1815条经验 获得超6个赞

当您创建新日历时,它包含当前日期和时间。之后,您更新除毫秒之外的所有字段。如您所见,所有输出中只有最后 3 个数字不同,这是执行时间的毫秒数。



查看完整回答
反对 回复 2023-03-31
?
倚天杖

TA贡献1828条经验 获得超3个赞

java.time

    ZoneId zone = ZoneId.of("Europe/Brussels");

    ZonedDateTime start2018 = LocalDate.of(2018, Month.JANUARY, 1).atStartOfDay(zone);

    Instant asInstant = start2018.toInstant();

    System.out.println(asInstant.toEpochMilli());

这始终提供以下输出:


1514761200000


如果不是欧洲/布鲁塞尔,请替换您想要的时区。


格式化输出:


    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");

    System.out.println(start2018.format(formatter));

2018/01/01 00:00:00


您使用的日期和时间类 — SimpleDateFormat、Calendar和GregorianCalendar—Date都设计不佳且早已过时。SimpleDateFormat特别是出了名的麻烦,但在这种情况下,正是糟糕的设计Calendar给了你意想不到的结果。其他答案已经解释了如何,我就不用重复了。我建议您使用现代 Java 日期和时间 API java.time,而不是旧类。与它一起工作要好得多。


查看完整回答
反对 回复 2023-03-31
?
MYYA

TA贡献1868条经验 获得超4个赞

在时间戳中,最后 3 位数字代表毫秒。在这里,您明确设置了日期和时间,但没有设置毫秒。这就是你面对这个的原因。为避免这种情况,您可以将其添加到您的代码中:

calendar.set(Calendar.MILLISECOND, 0);


查看完整回答
反对 回复 2023-03-31
?
Helenr

TA贡献1780条经验 获得超3个赞

我假设您正在示例中的循环中实例化所有内容?


如果是这样,则您没有设置毫秒差异,因此它们在循环的每次迭代中都会发生变化(但略有变化)。


为避免这种情况,您可以设置毫秒数,或在循环外进行实例化:


SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");

Calendar calendar = new GregorianCalendar();

calendar.set(2018, 0, 1, 0, 0, 0);

for (int i = 0; i < 5; i++) {

     System.out.println(sdf.format(calendar.getTime()));

     Date date = calendar.getTime();

     System.out.println(sdf.format(date));

     System.out.println(date.getTime());

}

这将产生:

2018/01/01 00:00:00

2018/01/01 00:00:00

1514764800128

2018/01/01 00:00:00

2018/01/01 00:00:00

1514764800128

2018/01/01 00:00:00

2018/01/01 00:00:00

1514764800128

2018/01/01 00:00:00

2018/01/01 00:00:00

1514764800128

2018/01/01 00:00:00

2018/01/01 00:00:00

1514764800128


查看完整回答
反对 回复 2023-03-31
  • 4 回答
  • 0 关注
  • 172 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信