Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.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_Postgresql_Date_Timezone_Eclipselink - Fatal编程技术网

Java 我如何在时区中存储和显示最初给定的日期?

Java 我如何在时区中存储和显示最初给定的日期?,java,postgresql,date,timezone,eclipselink,Java,Postgresql,Date,Timezone,Eclipselink,我有一个服务器,它从不同时区的客户端接收数据。数据源包含人、他们的出生日期和其他事件日期。出于我们的目的,如果我们能够将日期存储为提供给我们的日期,那将很方便 例如,如果客户在加利福尼亚州,它告诉我们此人的出生日期是5月31日,我们希望将其存储在数据库中,日期为太平洋时间1999年5月31日。这样,无论你在哪个时区,你都可以看到这个人出生在5月31日 同时,我们希望能够查询这些数据,以便能够找出诸如“此人是否未成年人”或“此事件是否发生在24小时前?” 客户端通过基于http的rest API向

我有一个服务器,它从不同时区的客户端接收数据。数据源包含人、他们的出生日期和其他事件日期。出于我们的目的,如果我们能够将日期存储为提供给我们的日期,那将很方便

例如,如果客户在加利福尼亚州,它告诉我们此人的出生日期是5月31日,我们希望将其存储在数据库中,日期为太平洋时间1999年5月31日。这样,无论你在哪个时区,你都可以看到这个人出生在5月31日

同时,我们希望能够查询这些数据,以便能够找出诸如“此人是否未成年人”或“此事件是否发生在24小时前?”

客户端通过基于http的rest API向我们发送数据。服务器是用Java编写的(使用eclipselink)。数据库是postgresql。是否可以满足这些要求


通常,人们会说将所有内容都存储为UTC,但我觉得这是个坏主意,因为我们会丢失原始数据的时区。

UTC是一个好办法。对于
timestamp tz
timestamp with time zone
)输入值的时区仅作为Postgres内部计算UTC的修饰符。(对于
时间戳[不带时区]
任何附加的时区都将被忽略!)。不会保存时区。您需要另外保存它,以了解世界上发生了什么事情

如果您这样做,您也可以存储本地时间戳。只是不要混淆哪个是哪个。要么将所有内容转换为UTC(对于
timestamtz
自动发生),要么将所有内容转换为本地时间(定义“本地”:您的本地?本地到db服务器?本地到用户?)

特别是,与其只存储“太平洋时间”,不如存储准确的时区名称(或对其的引用)。这对于夏令时、闰秒或其他事件更准确

详细说明:

关于时区名称和缩写:

关于时区处理:

测试结果100%正确

计算年龄 至于诸如计算未成年人年龄之类的问题,由于时间的关系,这有点棘手。使用库,您可以调用
withTimeAtStartOfDay
方法,将DateTime对象设置为一天中的第一个时刻。通常第一个时刻是时间
00:00
,但并不总是因为夏令时或其他原因异常。忽略与“午夜”相关的类和方法,因为它们已被上述方法取代

此外,为了准确地计算您的年龄,您可能希望将年龄计算为出生日期后一天或两天的第一个时刻。除非您知道他们的出生时间和出生时区,否则您无法准确地知道他们的年龄

避免使用j.u.Date/.Calendar 与java绑定的java.util.Date和.Calendar类是出了名的麻烦。请避免使用它们。使用和/或新绑定的(受Joda Time的启发,但经过重新架构)

与java.util.Date不同,其他两个库中的Date-time对象都知道自己分配的时区。j.u.Date特别容易混淆,因为它没有分配时区,但其
toString
方法应用JVM的当前默认时区,从而产生分配时区的错觉

Joda Time | java.Time 有了Joda Time和java.Time,事情就清楚多了。您可以为每个日期时间对象指定一个时区(否则会指定JVM默认值)。您可以轻松地从一个时区转换到另一个时区

两个库都使用,其中基于原始对象创建新对象,而不是更改(变异)原始对象

如果您认为这很重要,可以调用Joda Time对象来获取记录及其与UTC的偏移量

ISO 8601

学习有关日期时间值的敏感字符串格式的标准。考虑使用基于文本的API。ISO 8601现在是所有新互联网协议的标准。EX:<代码> 2014-0813T16:0201Z 或<代码> 2014-1222T11:54:23 +04:00 < /代码> ./P>


和使用。避免使用3或4个字母的代码,因为它们既不是标准的,也不是唯一的。

所以你是说每个日期列也需要一个额外的原始时区列?是的。如果你想回答这两个问题:
人的生日
以及
这个事件发生在24小时之前吗?
准确地说,你需要时间还有空格(“生日”取决于发生的地点)。实际上我建议使用时间戳(键入
timestamp
timestamp
)不仅仅是一个
date
。令人困惑的是,
java.util.date
存储时间数据。我说的时候是指java日期。谢谢,关于时区和时区有很多混淆……而且,我至少需要提一次,DST(夏令时)这是一个非常愚蠢的概念,应该被删除,以后再也不要提了。仔细阅读日期时间数据类型。阅读博士后专家大卫·E·惠勒的总结建议。