保存和检索从客户端到数据库的时间

这个问题在这里已经有了答案:

  • 夏令时和时区最佳做法[已关闭] 30个答案

  • 你的是许多其他问题的重复。 所以我会简短。

    有两种方法可以表示三种日期时间值:

  • 如果实际时间已过(付款,收到发票,送达法庭文件,送货到达等), 则以UTC保存并交换日期时间 ,或者如果将来您知道您希望在时间线上有特定时刻,无论政治家是谁重新定义时区,例如更改夏令时(DST)。 对于Java,使用Instant类。 在SQL中使用TIMESTAMP WITH TIME ZONE
  • 存储并交换日期 - 时间值,无需区域/偏移量,以便将来的事件安排得足够远以至于政治家可能会更改时区规则(明年的牙科预约,两个月内的访谈,派对公告等)。 世界各地的政客都表现出喜欢用我们的钟表摆弄,常常几乎没有什么警告,有时只有几个星期的事先通知。 对于Java,使用LocalDateTime类。 在SQL中,使用TIMESTAMP WITHOUT TIME ZONE 。 为了演示一个时间表,使用ZonedDateTime类,通过Instant::atZone方法在Java中生成瞬态数据。
  • 为非特定事件 (如圣诞节开始或说“我们在德里,杜塞尔多夫和底特律的所有工厂将于10月30日中午半天关闭”)存储和交换日期 - 时间值,而无区域/偏移量一年“,我们的意思是在当地的每个时间中午,而不是在同一时间。 对于Java,使用LocalDateTime类。 在SQL中,使用TIMESTAMP WITHOUT TIME ZONE
  • 作为程序员和系统管理员,学习以UTC和24小时的时间思考。 在工作中忘记你自己的教区时区。 在办公室保持第二个时钟设置为UTC。

    你如何知道用户的预期/期望的时区? 最终唯一确定的方法是问她/他。

    序列化为文本时,请使用标准ISO 8601格式。

    避免使用诸如java.util.Datejava.sql.Date等可怕的旧日期类,这些现在已经成为遗留问题,被业界领先的优秀java.time类所取代。

    Instant代表UTC中时间轴上的一个时刻。

    Instant instant = Instant.ofEpochMilli( millis ) ;
    

    为了向用户呈现,请将UTC调整到他们预期/期望的时区。 可以将其看作像国际化一样,您可以在其中存储对某个键的引用,然后使用检索的键查找本地化的文本值。

    切勿使用3-4个字符的伪时区。 真正的时区有continent/region名称,如Asia/KolkataPacific/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

    上一篇: Saving and retrieving time from client to database

    下一篇: Using date time in Java ee application