java - java 的本地时区问题

标签 java mysql datetime timezone

我有一个场景,我丢失了一些基于本地时区的小时数据。 Datastore 有 UTC 格式的记录。让我们假设本地时区是“亚洲/加尔各答”。用户有一些选项可以在日期之间进行选择,并且将在 UI 中为这些日期生成报告。对于每一天,用户都会看到当天从第一个小时到最后一个小时的计数。让用户在 UI 上输入 1 月 22 日到 2 月 12 日,然后查询将在这些日期之间触发,包括从 00:00 开始到 23:00 结束的两个日期,并给出 UTC 中的结果集。我有一个代码片段,其中该结果集将转换为本地时区,如下所述。

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,那么我将毫无遗漏地获取所有时间数据。

这是正确的行为吗?

我还尝试在以下代码片段的帮助下使用本地时区查询数据库,但它也给出了错误的计数。我不确定我是否需要在查询时执行此操作,但您可以看到以下代码片段?

 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 来使用它。

最佳答案

Lets user have entered Jan 22nd to feb 12th on the UI, then, then the query will be fire between these date inclusive of both dates starting from 00:00 hours to ending 23:00 Hours with given a result set in 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。

关于java - java 的本地时区问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44817538/

相关文章:

c# - 给定开始日期如何根据闰年找到有 365 或 366 天的结束日期

java - Android 中选项卡式 View 寻呼机的单独后退导航

java - 使用 GObject 方法时从 Hashtable 获取 NullPointerException

php - 如何通过关键词进行搜索? (PHP)

mysql - Ruby sort_by 用于 MySQL 返回的数组,日期格式为字符串

MySQL 默认 DATETIME 值

java - 如何使用 Eclipse 和 Maven 配置 Java 项目以连接到 Amazon RDS

java - QueryDSL:如何编写表达式以秒为单位查找日期差异?

mysql - 如何在 iOS 应用程序中存储/使用完整的英语词典?

python - 将日期范围拆分为多个范围