Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.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_Database_Timezone - Fatal编程技术网

Java 多时区的报告

Java 多时区的报告,java,database,timezone,Java,Database,Timezone,在我们的应用程序中,UI中有一个报告模块,管理员可以从中查看报告。管理员将获得一个选项选择从日期和截止日期。 在事务处理过程中,我们将实时数据存储在几个表中,这些表都可以作为核心表。数据以UTC时区存储在这些表中。 我们每30分钟运行一次调度程序,并将核心表中的数据转换为一天的事务数、响应时间等报告所需的数据。 对于管理员来说,要求显示的数据应基于其浏览器的时区。管理员分布在多个时区。我们如何存储数据以及如何检索数据?每次发送请求时,我们都无法计算值。在oracle中存储日期 在Java中,处理

在我们的应用程序中,UI中有一个报告模块,管理员可以从中查看报告。管理员将获得一个选项选择从日期和截止日期。 在事务处理过程中,我们将实时数据存储在几个表中,这些表都可以作为核心表。数据以UTC时区存储在这些表中。 我们每30分钟运行一次调度程序,并将核心表中的数据转换为一天的事务数、响应时间等报告所需的数据。 对于管理员来说,要求显示的数据应基于其浏览器的时区。管理员分布在多个时区。我们如何存储数据以及如何检索数据?每次发送请求时,我们都无法计算值。

在oracle中存储日期

在Java中,处理
Java.util.Date
但在存储它之前,将其转换为
Java.util.Calendar

Calendar gmtCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
gmtCal.setTime(date);

现在,您可以将其存储在base

中,按UTC存储事务是可以的,这通常是一种推荐做法

按照注释中的一些建议,使用带有时区的时间戳进行存储将具有额外的好处,即知道哪些本地时间和时区应用于事务数据。这也没关系,但这不是你要的

你说:

对于管理员来说,要求显示的数据应基于其浏览器的时区

我认为这意味着,无论数据库中的时间是以UTC还是以带有时区的本地时间设置的,您都希望在输出期间将数据转换为查看报告的人员的时区

但你也说过:

每次发送请求时,我们都无法计算值

好吧,因为每个观众可能都有可能不同的数据,我很抱歉地告诉你,但这正是你必须要做的。无论生成报告的应用程序逻辑是什么,都必须将数据的时间戳转换为查看器的本地时间。这通常不是在数据库中完成的,而是在中间层的应用程序逻辑中完成的。如果直接针对数据库生成报告,则某些报告引擎具有处理与报告本身关联的代码或脚本中的时间戳的功能


无论结果如何,您都应该确保在这些报告的某个地方(可能在页脚中)输出了时区。人类通常会通过电子邮件将报告输出给他们的主管、客户等,他们显然可能在不同的时区。

您使用的是什么数据库?AFAIK(某些)数据库支持带有时区的时间戳,并可以对其执行日期算法。也就是说,他们应该认识到
12:00 UTC+1
14:00 UTC+3
相同。然后,它将像选择本地时区作为参数的值一样简单。例如,Oracle关于时区的文档:@joe776:我们正在使用Oracle。然后您应该检查,您是否正在使用时区的时间戳,并测试Oracle是否自动正确。实际上,我们计划为每个时区创建表。调度器在运行时将把数据放在每个时区表中。因此,当用户发送关于特定时区的报告请求时,我们将直接从表中获取并给出它。这是一个糟糕的设计吗?我们无法在每次发送请求时进行计算,因为计算成本很高。
Calendar gmtCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
gmtCal.setTime(date);