gpt4 book ai didi

java - Postgresql 和 Java 之间的 UTC 偏差一小时

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:07:09 25 4
gpt4 key购买 nike

我有一个 java 程序,它以二进制格式生成 Postgresql 的 COPY 命令所期望的二进制格式的时区值。数据被写入一个二进制文件,然后我使用复制命令将其插入 Postgresql 到一个带有时间戳列(无时区)的表中。

格式本质上是数字 8 作为 4 字节值,后跟自 2000 年 1 月 1 日以来的微秒作为 8 字节值。

我发现 Postgresql 和 Java 对时区偏移量的解释有所不同。当我尝试写日期时:

2004-11-01 09:34:42.432

在 postgres 二进制格式中是

0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x8a, 0xcd, 0xe3, 0x10, 0x68, 0x00

并且 postgres 正确报告日期。但是,如果我输入日期

2010-11-01 09:34:42.432

在二进制中为

0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x36, 0xf8, 0x72, 0xcb, 0x64, 0x00

我得到 2010-11-01 08:34:42.432 作为 Postgres 中的时间戳。

进一步调查表明,Postgres 认为 2010 年的 UTC 偏移量是 -5,而 Java 认为它是 -4(我相信这是正确的)导致一小时的差异。任何人都知道解决这个问题的方法是什么?

相关信息:

PostgreSQL 版本 9.2.4

Java: 7

在东部时区(美国/纽约)工作。

操作系统:Linux(时区设置正确)

最佳答案

想通了。原来 Postgres 对时间戳列期望的微秒是自 2000 年 1 月 1 日 UTC 以来的微秒。换句话说,需要从 2000 年 1 月 1 日 UTC 中减去当前时间,而不是从本地时间 2000 年 1 月 1 日减去当前时间。我在做后者。

帮助他人的附加信息:

  1. 如果您的列是没有时区的时间戳:从当前时间发送微秒 - 2000 年 1 月 1 日 UTC + tz 微秒偏移量
  2. 如果您的列是带时区的时间戳:从当前时间发送微秒 - 2000 年 1 月 1 日 UTC。

(1) 在 UTC 中有效地成为当前时间“原样”(即,如果您正在尝试本地时间上午 9:00,如果偏移量为 -3,则不要使其成为 UTC 中午 12:00,而是对其进行编码如世界标准时间上午 9:00)减去世界标准时间 2000 年 1 月 1 日。重要的事实是,这与(本地时区的当前时间)-(本地时区的 2000 年 1 月 1 日)不同。

免费插件 我有一个 Java 库,用于使用 COPY 命令从一组 JPA 注释实体中直接将行插入 Postgresql。在 github 上可用:https://github.com/eclecticlogic/pedal-dialect

关于java - Postgresql 和 Java 之间的 UTC 偏差一小时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19979542/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com