【发布时间】:2021-12-04 04:34:11
【问题描述】:
我在数据库中有记录,其中列 created_date 保存为没有时区的时间戳。前端用户位于 +05.30 时区。后端托管在新加坡。因此 created_date 日期值比用户时间晚 5.30 小时。
如何正确选择在给定日期内创建的一组记录。
例如:如果用户在 2021 年 16 月 16 日请求数据,则服务器需要返回 created_date 在 2021-10-16 00:00:00 和 2021-10-16 23:59:59 之间的数据:他们当地时间是 999,即 +05.30
我为此编写了一个本机查询,如下所示,
select * from records rr where rr.created_date at time zone 'utc' at time zone 'Asia/Calcutta' between ?1 and ?2
我使用以下代码获得日期 1 和 2,仅在用户的时区 (+05.30) 上午 5.30 之后提供所需的数据集
Calendar startDate = (Calendar) Calendar.getInstance();
startDate.set(Calendar.HOUR_OF_DAY, 0);
startDate.set(Calendar.MINUTE, 0);
startDate.set(Calendar.SECOND, 0);
startDate.set(Calendar.MILLISECOND, 0);
Calendar endDate = (Calendar) startDate.clone();
endDate.set(Calendar.HOUR_OF_DAY, 23);
endDate.set(Calendar.MINUTE, 59);
endDate.set(Calendar.SECOND, 59);
endDate.set(Calendar.MILLISECOND, 999);
Date fromDate = startDate.getTime();
Date toDate = endDate.getTime();
所以,假设我需要将 startDate 和 endDate 转换为用户的本地时区,然后作为查询的参数传递,我做了以下,
Calendar startDate = (Calendar) Calendar.getInstance();
startDate.setTimeZone(TimeZone.getTimeZone("Asia/Calcutta")); // convert from server timezone to user's local timezone
startDate.set(Calendar.HOUR_OF_DAY, 0);
startDate.set(Calendar.MINUTE, 0);
startDate.set(Calendar.SECOND, 0);
startDate.set(Calendar.MILLISECOND, 0);
Calendar endDate = (Calendar) startDate.clone();
endDate.set(Calendar.HOUR_OF_DAY, 23);
endDate.set(Calendar.MINUTE, 59);
endDate.set(Calendar.SECOND, 59);
endDate.set(Calendar.MILLISECOND, 999);
Date fromDate = startDate.getTime();
Date toDate = endDate.getTime();
这仍然没有返回正确的数据集。如果我直接在 pgadmin 上运行以下查询,我可以获得结果
select * from records rr where rr.created_date at time zone 'utc' at time zone 'Asia/Calcutta' between '2021-10-16 00:00:00' and '2021-10-16 23:59:59'
如何使用我的代码获得相同的数据集?任何帮助将非常感激。 TIA
【问题讨论】:
-
您正在使用糟糕的日期时间类,这些类现在已经过时了。
Date和SimpleDateFormat在几年前被 JSR 310 中定义的现代 java.time 类所取代。
标签: java spring postgresql spring-boot hibernate