Java 标准api错误的时间

Java 标准api错误的时间,java,hibernate-criteria,criteria-api,Java,Hibernate Criteria,Criteria Api,我的数据库中有timestamp(6)列。 示例:“2020-10-01 00:00:00” 根据API标准,我做了两个谓词 private static Predicate withInstantGe(CriteriaBuilder cb, Root<Object> root, Instant date) { return Optional.ofNullable(date).map(d -> cb.greaterThanOrEqualTo(root.<Instant&g

我的数据库中有timestamp(6)列。 示例:“2020-10-01 00:00:00” 根据API标准,我做了两个谓词

private static Predicate withInstantGe(CriteriaBuilder cb, Root<Object> root, Instant date) {
return Optional.ofNullable(date).map(d -> cb.greaterThanOrEqualTo(root.<Instant>get("date"), d)).orElse(cb.and());
}

private static Predicate withInstantLe(CriteriaBuilder cb, Root<Object> root, Instant date) {
return Optional.ofNullable(date).map(d -> cb.lessThanOrEqualTo(root.<Instant>get("date"), d)).orElse(cb.and());
}

我会尝试以以下方式实现它,以便能够从时区中提取,这只会使问题变得复杂:

Calendar start = Calendar.getInstance();
start.set(Calendar.YEAR,2020);
start.set(Calendar.MONTH,9);
start.set(Calendar.DAY_OF_MONTH,1);
start.set(Calendar.HOUR,0);
start.set(Calendar.MINUTE,0);
start.set(Calendar.SECOND,0);

Calendar end = Calendar.getInstance();
start.set(Calendar.YEAR,2020);
start.set(Calendar.MONTH,9);
start.set(Calendar.DAY_OF_MONTH,1);
start.set(Calendar.HOUR,5);
start.set(Calendar.MINUTE,0);
start.set(Calendar.SECOND,0);
还有你的谓词:

cb.and(
    cb.greaterThanOrEqualTo(root.get("date"),start.getTime()),
    cb.lessThanOrEqualTo(root.get("date"),end.getTime())
)

我建议您不要用容易出错的遗留
java.util
date-time API污染clean

import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;

public class Main {
    public static void main(String[] args) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss");
        ZonedDateTime zdtStart = LocalDateTime.parse("2020-10-01 00:00:00", formatter)
                .atZone(ZoneId.of("Asia/Yekaterinburg"));
        System.out.println(zdtStart);

        // Add 5 hours to start date-time
        ZonedDateTime zdtEnd = zdtStart.plusHours(5);
        System.out.println(zdtEnd);

        // In case you need Instant from ZonedDateTime
        Instant start = zdtStart.toInstant();
        Instant end = zdtEnd.toInstant();
        System.out.println(start);
        System.out.println(end);
    }
}
输出:

2020-10-01T00:00+05:00[Asia/Yekaterinburg]
2020-10-01T05:00+05:00[Asia/Yekaterinburg]
2020-09-30T19:00:00Z
2020-10-01T00:00:00Z
有关现代日期时间API的更多信息,请访问


如果您是为您的Android项目执行此操作,并且您的Android API级别仍然不符合Java-8,请检查并执行任何更新。我的错误是,我使用了ZoneOffset.UTC,并且hibernate自动编辑请求中的日期,正如我所看到的,只需添加5个小时。解决方案是,当您将LocalDate转换为Instant时,使用本地偏移量,hibernate不会添加小时数,如下所示:
.toInstant(OffsetDateTime.now().getOffset())
我的错误是我使用了ZoneOffset.UTC,hibernate会在请求中自动编辑日期,正如我所看到的那样,只添加了5个小时。解决方案是,当您将LocalDate转换为Instant时,使用本地偏移量,hibernate不会添加小时数,如下所示:.toInstant(OffsetDateTime.now().getOffset())
2020-10-01T00:00+05:00[Asia/Yekaterinburg]
2020-10-01T05:00+05:00[Asia/Yekaterinburg]
2020-09-30T19:00:00Z
2020-10-01T00:00:00Z