java - 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>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());
}
但它不会返回日期从“2020-10-01 00:00:00”到“2020-10-01 05:00:00”的列,差异是 5 小时......而我的 ZoneInfo[id="Asia /叶卡捷琳堡”,但我并不低估它对标准回报的影响。
Calendar startCalendar = getCalendarFrom(); (method returns Calendar where i setted yead day month etc)
TimeZone sdvsd = startCalendar.getTimeZone();
Instant start = getInstant(startCalendar);
Calendar endCalendar = getCalendarTo();
Instant end = getInstant(endCalendar);
private Instant getInstant(Calendar calendar) {
ZonedDateTime zdt = ZonedDateTime.ofInstant(calendar.toInstant(), calendar.getTimeZone().toZoneId());
return zdt.withZoneSameLocal(ZoneOffset.UTC).toInstant();
}
解决方案
我建议您不要使用容易出错的旧日期时间 API 污染干净的现代日期java.util
时间 API。
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
在Trail: Date Time了解有关现代日期时间 API 的更多信息。
如果您正在为您的 Android 项目执行此操作,并且您的 Android API 级别仍然不符合 Java-8,请通过 desugaring和How to use ThreeTenABP in Android Project检查Java 8+ APIs available。
推荐阅读
- javascript - 单击计算器项目JS中的按钮后检索文本
- javascript - “string”参数必须是 string、Buffer 或 ArrayBuffer 类型之一。接收到的类型对象
- raspberry-pi - Raspberry Pi 中的 Mosquitto 代理设置桥接物联网中心 SAS 令牌
- javascript - 从更新的 url 获取查询字符串参数
- amazon-web-services - 无法为 AWS S3 数据传输创建访问密钥
- java - 如何正确关闭 ZipInputStream 以便在操作结束时以编程方式关闭 zip 文件?
- typescript - 联合类型和遍历数组
- jenkins - Jenkins - 如何获取在共享库中定义的属性/选择参数字段
- android - 屏幕顶部出现无意的白线
- css - 复选框对齐表格替代品