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

Java日期和MySQL时间戳时区

路雅懿
2023-03-14
timestamp = new Date();

然后将timestamp变量持久化到timestampMySQL表列中。
然而,虽然通过调试,我看到date对象显示在正确的时区GMT+1,但在数据库上持久化时,它是一个GMT时区,所以要追溯一个小时。

使用函数current_timestamp返回一个GMT+1日期。
连接字符串为jdbc:mysql://.../db-name,没有任何参数。

编辑:找到这段代码

preparedStatement.setTimestamp(2, new Timestamp(timestamp.getTime()));

共有1个答案

呼延英奕
2023-03-14
myPreparedStatement
.setObject(  
    … ,                                   // Specify which placeholder `?` in your SQL statement. 
    OffsetDateTime.now( ZoneOffset.UTC )  // Capture the current moment as seen in the wall-clock time of UTC (an offset-from-UTC of zero).
) ;

您正在使用几年前被java.time类取代的糟糕的日期时间类。

不要使用日期时间戳

捕获当前时刻,用UTC表示。大多数数据库都以UTC形式存储片刻。通常,您应该用UTC完成大部分业务逻辑、调试、日志记录、存储和数据交换。

OffsetDateTime odt = OffsetDateTime.now( ZoneOffset.UTC ) ) ;

若要将此时刻保存到数据类型类似于带有时区的SQL标准时间戳的列中:

myPreparedStatement.setObject( … , odt ) ;

检索:

OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;

要向用户显示此检索到的时刻,您可能需要调整到用户的预期/期望时区。

ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = odt.atZoneSameInstant( z ) ;

那些转换方法主要使用instant对象。instant是以UTC表示的时刻,总是以UTC表示。您可以通过提取即时offsetdatetime调整为UTC。instant类是java.time中的基本构建块类,而offsetdatedate具有更大的灵活性,例如在生成字符串时可以选择格式模式。但是instantoffsetDateTime都表示一个时刻,即时间线上的一个点。

Instant instant = odt.toInstant() ;  
java.sql.Timestamp ts = org.threeten.bp.DateTimeUtils.toSqlTimestamp( instant ) ;

反过来,从数据库中检索时间戳,然后立即转换为即时

java.sql.Timestamp ts = myResultSet.getTimestamp( … ) ;
Instant instant = org.threeten.bp.DateTimeUtils.toInstant( ts ) ;

Java.time框架内置在Java8和更高版本中。这些类取代了麻烦的旧的遗留日期时间类,如java.util.dateCalendar、&SimpleDateFormat

要了解更多信息,请参阅Oracle教程。并搜索堆栈溢出的许多例子和解释。规范是JSR310。

您可以直接与数据库交换java.time对象。使用符合JDBC4.2或更高版本的JDBC驱动程序。不需要字符串,也不需要java.sql.*类。

从哪里获得java.time类?

    null
    null
    null
 类似资料:
  • 问题内容: 在Java应用程序中,使用日期时间和时间戳的混合在MySQL数据库中添加和输入日期信息方面有什么好的折衷办法? 问题答案: 在Java方面,日期通常由(设计欠佳,但不包括在内)表示。它基本上是由支持大纪元时间中的味道long,也称为时间戳。它包含有关日期和时间部分的信息。在Java中,精度以毫秒为单位。 在SQL方面,有几个标准的日期和时间类型,DATE,TIME和TIMESTAMP(

  • 我正在为我的聊天应用程序使用firebase。在聊天对象中,我使用方法添加时间戳。 请就这个问题提出解决办法

  • 问题内容: 如何将Unix时间戳中的时间转换为正常时间? 问题答案: 您的问题含糊不清。我将消除时区的歧义。 如何将Unix时间戳中的时间转换为正常时间? 我怀疑您是以某种方式从数据库而不是从中获取或一个值。在JDBC中,通常希望使用适当的方法来获取特定于DB的数据类型。可以获取MySQL 数据类型,从而为您提供,而后者又是的子类。 简而言之,应该执行以下操作: 要将其呈现给最终用户时,要以人类可

  • 问题内容: 我有一个数据库,它将具有标准sql格式的UMT时间戳。如何提取数据并为其设置Java日期对象? 据我所知mysql是 至于Java,日期/时间的东西一直躲着我。 如果有人为此知道一个好的图书馆,我欢迎您提出建议。 问题答案: 为什么不直接阅读为 看到

  • 问题内容: 全部, 我有一个带有称为时间戳记的列的MYSQL表。它的数据类型为“ 10/1/2009 3:25:08 PM”,“ 10/1/2009 3:30:05 PM”,“ 10/4/2009 3:40:01 PM”,等等.. 我想编写一个SQL查询来选择在两个日期之间出现的时间戳字段中的所有值。 userInput日期将没有时间部分。您能为此建议正确的MySQL查询语法吗?谢谢 问题答案:

  • 本文向大家介绍在MySQL中设置当前日期和时间作为时间戳,包括了在MySQL中设置当前日期和时间作为时间戳的使用技巧和注意事项,需要的朋友参考一下 让我们首先创建一个表。列之一设置为TIMESTAMP- 使用insert命令在表中插入一些记录。在这里,我们使用方法-将当前日期和时间设置为时间戳列- 使用select语句显示表中的所有记录- 这将产生以下输出-