java - 使用相同参数的不同调用会产生不同的 LocalDateTime 结果

标签 java spring-boot

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

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

本地日期时间方式:

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。

最佳答案

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

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

timestamp = 1536933600
dayStartTimeStamp = 1536876000
dayEndTimeStamp = 1536962399

关于java - 使用相同参数的不同调用会产生不同的 LocalDateTime 结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54255983/

相关文章:

java - 如何在YouTube( WebView )中使用全屏显示?

java - 检查 spring mvc 注册表中的两个密码条目是否相同?

java - NoClassDefFoundException : javax/persistence/PersistenceContext Spring ORM with Hibernate

Spring boot jar 在添加 tomcat-embed-jasper 依赖项时无法启动嵌入式服务器

来自复杂 XML 的 Java 对象,仅对子元素感兴趣

java - 不可读属性异常 : Invalid property 'names' of bean class

java - 在Android中减去两个值并显示

java - 为什么 Java 除以 0.0 时不抛出异常?

angularjs - 如何检索oracle sql查询的进度?

java - 为什么我的 H2 数据库/Spring 启动应用程序会收到 JdbcSQLException(非十六进制字符)?