【问题标题】:Local timezone issues with javajava的本地时区问题
【发布时间】: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


【解决方案1】:

让用户在 UI 上输入 1 月 22 日到 2 月 12 日,然后,查询将在这些日期之间触发,包括从 00:00 开始到 23:00 结束的两个日期,并给出 UTC 格式的结果集.

在我看来,这听起来像是您正在使用用户提供的一系列本地时间戳来查询包含 UTC 时间戳的表,而忽略了不同的时区。 您需要先将本地时间戳转换为UTC,并使用转换后的值查询数据库。

如果你不出错的话。

例如说该表包含时间戳为Jan 22nd 23:00 (UTC) 的记录。当您使用本地时间戳Jan 23nd 00:00 (UTC+1) 查询表时,即使它们完全相同,您也不会得到该记录。

在您的情况下,亚洲/加尔各答时区等于 UTC+5:30。因此,如果向数据库查询 UTC 时间戳 Jan 1st 00:00,然后将结果转换为本地日期时间,则 Jan 1st 00:00 的结果将变为 Jan 1st 05:30。

【讨论】:

    猜你喜欢
    • 2015-05-15
    • 2014-10-04
    • 2020-06-05
    • 2020-12-20
    • 2013-08-15
    • 1970-01-01
    • 2014-10-25
    • 2012-09-11
    相关资源
    最近更新 更多