保存和检索从客户端到数据库的时间
这个问题在这里已经有了答案:
你的是许多其他问题的重复。 所以我会简短。
有两种方法可以表示三种日期时间值:
Instant
类。 在SQL中使用TIMESTAMP WITH TIME ZONE
。 LocalDateTime
类。 在SQL中,使用TIMESTAMP WITHOUT TIME ZONE
。 为了演示一个时间表,使用ZonedDateTime
类,通过Instant::atZone
方法在Java中生成瞬态数据。 LocalDateTime
类。 在SQL中,使用TIMESTAMP WITHOUT TIME ZONE
。 作为程序员和系统管理员,学习以UTC和24小时的时间思考。 在工作中忘记你自己的教区时区。 在办公室保持第二个时钟设置为UTC。
你如何知道用户的预期/期望的时区? 最终唯一确定的方法是问她/他。
序列化为文本时,请使用标准ISO 8601格式。
避免使用诸如java.util.Date
和java.sql.Date
等可怕的旧日期类,这些现在已经成为遗留问题,被业界领先的优秀java.time类所取代。
Instant
代表UTC中时间轴上的一个时刻。
Instant instant = Instant.ofEpochMilli( millis ) ;
为了向用户呈现,请将UTC调整到他们预期/期望的时区。 可以将其看作像国际化一样,您可以在其中存储对某个键的引用,然后使用检索的键查找本地化的文本值。
切勿使用3-4个字符的伪时区。 真正的时区有continent/region
名称,如Asia/Kolkata
和Pacific/Auckland
。
ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;
请注意,数据库在处理日期时间方面差别很大。 SQL标准几乎没有涉及到这个问题。 研究文档并进行实验以确保您了解其行为。 同上您的JDBC驱动程序。 提示:Postgres对日期时间类型和函数有一些最好的支持。
在JDBC 4.2及更高版本中,通过调用以下命令通过java.time对象与数据库交换数据:
PreparedStatement::setObject
ResultSet::getObject
示例代码
myPStmt.setObject.( … , myInstant ) ;
…和…
Instant instant = myResultSet.getObject( … , Instant.class ) ;
当你存储时间时,最好的选择是将它存储在任何时间的任何地方(如果你愿意的话,可以是unix时间),然后在前端将其反序列化。 这意味着你可以放心,你坚持了正确的时间,然后你可以在前端进行转换。 在不知道具体情况的情况下,我怀疑你在Java中创建的日期对象是导致分流,然后将错误的日期值存储在数据库中。
链接地址: http://www.djcxy.com/p/29349.html