Javascript 保存和检索从客户端到数据库的时间
在我的一个web应用程序中,我必须安排一个事件。 我的服务器、客户端和数据库位于不同的时区。 客户端将安排一个事件,服务器必须执行该事件 我该怎么做 目前,我正在从客户端发送事件的时间(以毫秒为单位,从纪元开始):(使用javascript中日期的getTime()方法) 在服务器中,我使用Java将其转换为日期对象,并将其作为日期类型值存储在数据库中 在数据库中,存储的值比我从客户端提供的值晚了一天。Javascript 保存和检索从客户端到数据库的时间,javascript,java,timezone,Javascript,Java,Timezone,在我的一个web应用程序中,我必须安排一个事件。 我的服务器、客户端和数据库位于不同的时区。 客户端将安排一个事件,服务器必须执行该事件 我该怎么做 目前,我正在从客户端发送事件的时间(以毫秒为单位,从纪元开始):(使用javascript中日期的getTime()方法) 在服务器中,我使用Java将其转换为日期对象,并将其作为日期类型值存储在数据库中 在数据库中,存储的值比我从客户端提供的值晚了一天。 为什么会这样?如何将时间存储在服务器中?当您存储时间时,最好将时间存储在epoch time
为什么会这样?如何将时间存储在服务器中?当您存储时间时,最好将时间存储在epoch time(或者unix time,如果您愿意的话)中的任何位置,并在前端对其进行反序列化。这意味着您可以确信自己坚持了正确的时间,然后可以在前端转换它。在不知道细节的情况下,我怀疑您在Java中创建的日期对象导致了偏移,然后您在数据库中存储了错误的日期值 在存储时间时,最好将其存储在epoch时间(或者unix时间,如果您愿意的话)中的任何地方,并在前端反序列化它。这意味着您可以确信自己坚持了正确的时间,然后可以在前端转换它。在不知道细节的情况下,我怀疑您在Java中创建的日期对象导致了偏移,然后您在数据库中存储了错误的日期值 你的问题重复了许多其他问题。所以我会简短地说 有两种方式可以表示三种日期时间值:
- 如果实际时间已经过去(付款、收到发票、送达法庭文件、货物到达等),或者如果将来您知道您希望在时间线上有一个特定的时间,则存储和交换日期时间的值,无论政客是否重新定义时区(如更改)。对于Java,使用类。在SQL中,使用带时区的时间戳
- 存储和交换日期时间不带区域/偏移的值,以安排未来事件足够远,政治家可能会更改时区规则(明年的牙科预约、两个月后的采访、政党公告等)。世界各地的政客都表现出了玩弄我们的时钟的癖好,通常没有什么警告,有时只是提前几周通知。对于Java,使用类。在SQL中,使用不带时区的时间戳。要显示计划,请使用
class,通过方法在Java中生成瞬态数据zoneDateTime
- 存储和交换日期时间对于非特定事件,如圣诞节开始或说“我们在德里、杜塞尔多夫和底特律的所有工厂将于今年10月30日中午关闭半天”,不带区域/偏移值我们指的是当地时间的正午,而不是同时的中午。对于Java,使用类。在SQL中,使用不带时区的时间戳李>
java.util.date
和java.sql.date
等。这些类现在是遗留的,被业界领先的优秀java.time类所取代
表示中时间线上的一个时刻
为了向用户演示,请将UTC调整为他们期望/期望的时区。可以这样想,在这里存储对键的引用,然后使用检索到的键来查找本地化的文本值
切勿使用3-4个字符的伪时区。拥有大陆/地区
名称,如亚洲/加尔各答
和太平洋/奥克兰
ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;
请注意,数据库在处理日期时间方面差异很大。SQL标准几乎没有涉及这个主题。研究文档并进行实验,以确保您了解其行为。JDBC驱动程序也是如此。提示:对和有一些最好的支持
使用和更高版本,通过调用以下命令,通过java.time对象与数据库交换数据:
PreparedStatement::setObject
ResultSet::getObject
myPStmt.setObject.( … , myInstant ) ;
……还有
Instant instant = myResultSet.getObject( … , Instant.class ) ;
你的问题与许多其他问题完全相同。所以我会简短地说 有两种方式可以表示三种日期时间值:
- 如果实际时间已经过去(付款、收到发票、送达法庭文件、货物到达等),或者如果将来您知道您希望在时间线上有一个特定的时间,则存储和交换日期时间的值,无论政客是否重新定义时区(如更改)。对于Java,使用类。在SQL中,使用带时区的时间戳
- 存储和交换日期时间不带区域/偏移的值,以安排未来事件足够远,政治家可能会更改时区规则(明年的牙科预约、两个月后的采访、政党公告等)。世界各地的政客都表现出了玩弄我们的时钟的癖好,通常没有什么警告,有时只是提前几周通知。对于Java,使用类。在SQL中,使用不带时区的时间戳。要显示计划,请使用
class,通过方法在Java中生成瞬态数据zoneDateTime
- 存储和交换日期时间值,对于非特定事件,如圣诞节开始或说“我们在德里、杜塞尔多夫和底特律的所有工厂”,不带区域/偏移
Instant instant = myResultSet.getObject( … , Instant.class ) ;