通过具有相同参数的不同调用,LocalDateTime的结果不同

时间:2019-01-18 14:27:20

标签: java spring-boot

问题是,我必须将代码从Calendar对象更改为LocalDateTime对象。但最后我没有得到相同的时间戳。在第一个调用中,我对localDateTime的使用相同,在下一个调用中,我使用了其他时间戳,并且使用相同的参数来计算时间戳。我不知道为什么我得到不同的结果。对我来说这不是逻辑。我想做的是:获得一个UTC时间戳。我想将其设置为德国(欧洲/柏林)时间(重要的夏季和冬季)。然后,我要计算一天的开始时间(00:00)和一天的结束时间(23:59)。然后我想获得这次的时间戳。

我用spring-boot构建了一个API。控制器类从spring-boot调用上述函数。 API启动后的第一次调用将计算预期结果。但是所有接下来的调用都会给出其他结果。始终与7200有所不同。我用localDateTime尝试了其他方法,但从未提供与日历相同的时间戳。

LocalDateTimeWay:

LocalDateTime localDateTime = 
LocalDateTime.ofInstant(Instant.ofEpochSecond(timestamp), ZoneId.systemDefault());
LocalDateTime dayStartLocal = localDateTime.withHour(0)
    .withMinute(0)
    .withSecond(0)
    .withNano(0);

ZonedDateTime startZonedDateTime = dayStartLocal.atZone(ZoneId.systemDefault());
long dayStartTimeStamp = startZonedDateTime.toInstant().getEpochSecond();

LocalDateTime dayEndLocal = localDateTime.withHour(23)
    .withMinute(59)
    .withSecond(59)
    .withNano(999);

ZonedDateTime endZonedDateTime = dayEndLocal.atZone(ZoneId.systemDefault());
long dayEndTimeStamp = endZonedDateTime.toInstant().getEpochSecond();

日历方式:

Calendar cal=Calendar.getInstance();
cal.setTimeInMillis(timestamp*1000);
cal.setTimeZone(TimeZone.getTimeZone("Europe/Berlin"));

cal.set(Calendar.HOUR_OF_DAY,0);
cal.set(Calendar.MINUTE,0);
cal.set(Calendar.SECOND,0);
cal.set(Calendar.MILLISECOND,0);
long dayStartTimeStamp = calendar.getTimeInMillis()/1000L;

cal.set(Calendar.HOUR_OF_DAY,23);
cal.set(Calendar.MINUTE,59);
cal.set(Calendar.SECOND,59);
cal.set(Calendar.MILLISECOND,999);

long dayEndTimeStamp = calendar.getTimeInMillis()/1000L;

我想要参数时间戳1536933600。结果1536876000和1536962399。但是在localDateTime方法1536883200和1536969599的第一个请求之后,我得到了。

1 个答案:

答案 0 :(得分:4)

您正在将系统默认区域用于java.time代码,并将欧洲/柏林区域用于Calendar代码。 7200很可能是您的系统时区和欧洲/柏林(2小时)之间的时差。

将所有ZoneId.systemDefault()替换为ZoneId.of("Europe/Berlin"),在两个版本中您将获得相同的值:

timestamp = 1536933600
dayStartTimeStamp = 1536876000
dayEndTimeStamp = 1536962399