Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java的本地时区问题_Java_Mysql_Datetime_Timezone - Fatal编程技术网

java的本地时区问题

java的本地时区问题,java,mysql,datetime,timezone,Java,Mysql,Datetime,Timezone,我有一个场景,我丢失了一些基于本地时区的小时数据。数据存储有UTC格式的记录。假设本地时区为“亚洲/加尔各答”。用户可以在日期之间选择一些选项,并且将在UI中为这些日期生成报告。对于每一天,用户将看到从第一个小时到最后一个小时的计数。允许用户在UI上输入1月22日至2月12日,然后,将在这些日期之间触发查询,包括从00:00小时开始到23:00小时结束的两个日期,并以UTC为给定结果集。我有一个代码片段,其中这个结果集将转换为本地时区,如下所述 java.util.Calendar cal =

我有一个场景,我丢失了一些基于本地时区的小时数据。数据存储有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开始获取数据。如果我在resultset calendar实例中设置了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 time,我现在不想使用java7

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

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

如果你不出差错的话

例如假设该表包含一条时间戳为
1月22日23:00(UTC)
的记录。当您使用本地时间戳
1月23日00:00(UTC+1)
查询表时,即使记录完全相同,也无法将其取出

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

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

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

如果你不出差错的话

例如假设该表包含一条时间戳为
1月22日23:00(UTC)
的记录。当您使用本地时间戳
1月23日00:00(UTC+1)
查询表时,即使记录完全相同,也无法将其取出


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

我怀疑不是您想要的
Calendar.getInstance(“Asia/Kolkata”)
而是Calendar.getInstance(TimeZone.getTimeZone(“Asia/Kolkata”),我以前是这样用的,只是我在这里输入了一个错误我怀疑你不是有意在这里输入Calendar.getInstance(“亚洲/加尔各答”)而是想在这里输入Calendar.getInstance(TimeZone.getTimeZone(“亚洲/加尔各答”)