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

时间:2019-07-16 14:11:40

标签: java date calendar unix-timestamp

我正在将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次后的值。

1514761200624
1514761200618
1514761200797
1514761200209
1514761200132

4 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:2)

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

您使用的日期和时间类别(SimpleDateFormatCalendarGregorianCalendarDate)设计得很差,而且已经过时了。 SimpleDateFormat尤其麻烦,但在这种情况下,Calendar的不良设计给您带来了意想不到的结果。其他答案已经解释了如何,无需我重复。我建议您不要使用旧的类,而应使用现代的Java日期和时间API java.time。与之合作真是太好了。

链接: Oracle tutorial: Date Time解释了如何使用java.time。

答案 2 :(得分:1)

在时间戳记中,最后3位数字表示毫秒。在这里,您将明确设置日期和时间,而不是毫秒。这就是为什么您要面对这个问题。为了避免这种情况,您可以将其添加到您的代码中:

  QueueDataWarehouse(my_rsid,
                     date.from = "2019-06-01",
                     date.to = "2019-06-30",
                     segment.id = "s300007365_5b366bb3f30aae698e8b0488",
                     elements = c("entrypage"),
                     metrics = c("uniquevisitors","averagetimespentonpage", "event123", "event38"),
                     enqueueOnly = F)

答案 3 :(得分:0)

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

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

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

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