当前位置: 首页 > 知识库问答 >
问题:

如何从JDBC+PostgreSQL时间戳中获取UTC时间戳?

滕无尘
2023-03-14
create table myTable (
    dateAdded timestamp(0) without time zone null default (current_timestamp at time zone 'UTC');
)

我选择“无时区”是因为我知道我的应用程序使用的所有时间戳总是UTC。就我得到的文档而言,“with timestamp”的唯一区别是,我可以提供其他时区的值,然后将其转换为UTC。然而,我想避免这样的自动转换,因为如果我知道我的值是UTC,它们几乎没有任何好处。

当我在html" target="_blank">测试表中添加新记录并使用pgAdmin查看表的内容时,我可以看到插入日期已正确地保存为UTC格式。

但是,当我尝试使用JDBC选择值时,该值会减去2小时。我位于UTC+2,因此看起来JDBC假定表中的日期不是UTC时间戳,而是UTC+2时间戳,并尝试转换为UTC。

@MappedTypes(DateTime.class)
public class DateTimeTypeHandler extends BaseTypeHandler<DateTime> {
    private static final Calendar UTC_CALENDAR = Calendar.getInstance(DateTimeZone.UTC.toTimeZone());

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i,
            DateTime parameter, JdbcType jdbcType) throws SQLException {
        ps.setTimestamp(i, new Timestamp(parameter.getMillis()), UTC_CALENDAR);
    }

    @Override
    public DateTime getNullableResult(ResultSet rs, String columnName)
            throws SQLException {
        return fromSQLTimestamp(rs.getTimestamp(columnName, UTC_CALENDAR));
    }
    /* further get methods with pretty much same content as above */

    private static DateTime fromSQLTimestamp(final Timestamp ts) {
        if (ts == null) {
            return null;
        }
        return new DateTime(ts.getTime(), DateTimeZone.UTC);
    }
}

从JDBC+PostgreSQL时间戳源获取UTC时间戳的正确方法是什么?

共有1个答案

松骏俊
2023-03-14

将UTC设置为JVM-duser.timezone=UTC的默认时区,或者将整个OS设置为UTC。

在Postgres中,timestamptimestampwith timezone的存储方式相同-自Postgres历元(2000-01-01)以来的秒数。主要区别是Postgres在保存时间戳值(如2004-10-19 10:23:54+02)时所做的操作:

  • 没有TZ,+02将被删除
  • 对于TZ,执行-02校正,使其成为UTC
  • 在没有TZ的情况下,存储值由用户的(JVM/OS)TZ移位
  • 对于TZ,该值被认为是UTC

在这两种情况下,您都将得到java.sql.timestamp对象,该对象具有用户的默认tz。

没有TZ的时间戳非常有限。如果您有两个系统连接到您的数据库,它们都具有不同的TZ,那么它们将以不同的方式解释时间戳。因此,我强烈建议您使用timestamp WITH timezone

 类似资料:
  • 问题内容: 在编写Web应用程序时,将 所有 日期时间(服务器端)存储在数据库中作为UTC时间戳是有意义的。 当我发现您无法在JavaScript中对时区进行操作方面自然无法做到这一点时,我感到非常惊讶。 我稍微扩展了Date对象。这个功能有意义吗?基本上,每次我向服务器发送任何内容时,都会使用该功能格式化时间戳记。 您在这里看到任何重大问题吗?还是从另一个角度解决问题? 在我看来,这有点令人费解

  • 我正在尝试使用Joda在一个简单的Java程序中获取UTC时间戳: 程序输出如下: 毫秒值是正确的UTC时间(即用时区确认)第二个值是时区。 我需要的是UTC值不变为(即独立于TZ),用于数据库写入。这可能吗? 我知道是本地日期(GMT-4),是UTC(GMT-0)。日期的输出值如下: 我尝试了所有组合,试图将的UTC值作为java.sql.TimeStamp: 用于测试的打印输出: 第一行是正确

  • 问题内容: 如何从PostgreSQL的时间戳获取最多只有几分钟而不是几秒钟的日期和时间。我需要日期和时间。 例如: 为此,我需要 从带有时区的时间戳字段中说出,如何使用PostgreSQL select查询获取日期和时间。 请帮我。 问题答案: postgresql有很多可用的日期时间函数: 在这里查看清单 http://www.postgresql.org/docs/9.1/static/fu

  • 问题内容: 有没有一种方法可以通过指定日期来获取UTC时间戳?我期望的是: 应该导致 创建朴素的datetime对象意味着没有时区信息。如果我查看datetime.utcfromtimestamp的文档,则创建UTC时间戳意味着会忽略时区信息。因此,我猜想,创建一个简单的datetime对象(如我所做的那样)会导致UTC时间戳。然而: 结果是 datetime对象中是否还存在任何隐藏的时区信息?我

  • 问题内容: 我正在寻找将UTC时间字符串转换为Unix时间戳的选项。 我拥有的字符串变量是,需要将其转换为unix时间戳,例如 任何想法如何做到这一点? 问题答案: 首先,unix时间戳没有时间,但以UTC为单位。 在包有功能解析与预计解析时的布局。布局是从参考时间开始构造的。因此,在您的情况下,布局应为。使用Parse之后,您将获得一个可以调用Unix来接收Unix时间戳的结构。

  • 问题内容: 通过将值放入构造函数中,我可以将unix时间戳转换为对象。例如:我可以将其作为。 但是在那之后,如何从该对象取回unix时间戳? 问题答案: 检索自格林尼治标准时间1970年1月1日传递给构造函数以来的毫秒数。从中获得Unix时间(相同,但以秒为单位)并不难。