【发布时间】:2017-12-02 16:57:32
【问题描述】:
我有一个场景,我丢失了一些基于本地时区的小时数据。数据存储区有 UTC 记录。让我们假设当地时区是“亚洲/加尔各答”。用户可以在日期之间选择一些选项,并且会在 UI 中为这些日期生成报告。对于每一天,用户都会看到从第一个小时到最后一个小时的当天计数。让用户在 UI 上输入 1 月 22 日到 2 月 12 日,然后,查询将在这些日期之间触发,包括从 00:00 开始到 23:00 结束的两个日期,并给出 UTC 中的结果集。我有一个代码 sn-p,其中这个结果集将被转换为本地时区,如下所述。
java.util.Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("Asia/Kolkata"));
java.sql.Timestamp ts = resultSet.getTimestamp(PUBLISH_TIME, cal);
因此,由于本地时区,即 1 月 22 日,最终结果集错过了一些小时数据(除此开始日外,其他天数正确)我将从 05:30 小时而不是从 00:00 小时获取数据的一天。如果我在结果集日历实例中设置了 UTC,那么我将获得所有小时数据而没有任何遗漏。
这是正确的行为吗?
我还尝试在以下 sn-p 的帮助下使用本地时区查询数据库,但它也给出了错误的计数。我不确定是否需要在查询时执行此操作,但您可以看到下面的 sn-p?
SimpleDateFormat localTimeFormatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
localTimeFormatter.setTimeZone(TimeZone.getTimeZone("Asia/Kolkata"));
SimpleDateFormat utcFormatter = new SimpleDateFormat(DateUtil.DATE_PATTERN);
utcFormatter.setTimeZone(TimeZone.getTimeZone("UTC"));
Date startDateUTC;
String startDateUTCString;
Date endDateUTC;
String endDateUTCString;
try {
startDateUTC = localTimeFormatter.parse(reportCriteria.getStartDate());
startDateUTCString = utcFormatter.format(startDateUTC);
endDateUTC = localTimeFormatter.parse(reportCriteria.getEndDate());
endDateUTCString = utcFormatter.format(endDateUTC);
} catch (ParseException e) {
e.printStackTrace();
log.error("Error while formating Date :" + e);
如何获取本地时区的错过时间数据? 我没有使用 joda 时间,我现在不想在使用 java7 时使用它。
【问题讨论】:
-
我怀疑你想要的是
Calendar.getInstance(TimeZone.getTimeZone("Asia/Kolkata"))而不是Calendar.getInstance("Asia/Kolkata")? -
是的,我就是这样使用的,只是我在这里输入了一个错误
标签: java mysql datetime timezone