java的本地时区问题

时间:2017-06-29 06:10:25

标签: java mysql datetime timezone

我有一个场景,我根据当地时区错过了一些小时数据。数据存储区具有UTC记录。让我们假设当地时区是" Asia / Kolkata"。用户可以选择日期之间的选项,并在UI中为这些日期生成报告。对于每一天,用户将看到当天从第一小时到最后一小时的计数。让用户在UI上输入1月22日到12月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。

1 个答案:

答案 0 :(得分:0)

  

让用户在UI上输入1月22日至12月12日,然后查询将在这些日期之间触发,包括从00:00开始到结束23:00小时的两个日期,并给出以UTC为单位的结果

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

如果你没有出错。

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

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