将Joda LocalDate或java.util.Date转换为一天开始时有时间的LocalDateTime
我正在使用Joda 2.5 将Joda LocalDate转换为LocalDateTime时遇到问题 正如我所说,我能够将LocalDate转换为DateTime,时间为StartOfDay。我希望通过LocalDateTime对象实现相同的功能 我的代码是: 假设日期来自不同的REST服务,例如 现在,该日期被传递给另一个服务,如下所示: 我想要LocalDateTime对象,因为我正在mysql中存储这个LocalDateTime作为时间戳 请提供将LocalDate中的对象转换为LocalDateTime对象的解决方案。 例如:“2015-02-01”到“2015-02-01 00:00:01” YYYY-MM-DD至YYYY-MM-DD HH:MM:SS:zzz将Joda LocalDate或java.util.Date转换为一天开始时有时间的LocalDateTime,java,datetime,jodatime,Java,Datetime,Jodatime,我正在使用Joda 2.5 将Joda LocalDate转换为LocalDateTime时遇到问题 正如我所说,我能够将LocalDate转换为DateTime,时间为StartOfDay。我希望通过LocalDateTime对象实现相同的功能 我的代码是: 假设日期来自不同的REST服务,例如 现在,该日期被传递给另一个服务,如下所示: 我想要LocalDateTime对象,因为我正在mysql中存储这个LocalDateTime作为时间戳 请提供将LocalDate中的对象转换为Local
但不是LocalDate-to-DateTime一旦你消除了时区异常,你可以假设每天从午夜开始,所以使用:
LocalDateTime localDateTime = localDate.toLocalDateTime(LocalTime.MIDNIGHT);
不清楚你为什么想在午夜后1秒结束。如果您真的需要,请创建自己的表示该时间的常量LocalTime
,并在上述代码中使用它而不是MIDNIGHT
还要注意的是,如果您确实有一个日期
,您可能已经丢失了信息。听起来传入的数据实际上是一个字符串-最好直接将其解析为LocalDate
,以避免时区可能导致问题。tl;博士
java.time
该项目现在正在进行中,团队建议迁移到类。看
解析输入字符串
LocalDate ld = LocalDate.parse( "2015-02-05" ) ;
未分区
如果您的业务问题与UTC或时区之间没有任何偏移,并且不是时间线上的特定时刻,则通过将其转换为时间线来获取一般24小时工作日的第一个时刻
ldt.toString():2015-02-05T00:00
要将其存储在数据库中的数据类型列中,类似于SQL标准类型的无时区时间戳,请使用符合JDBC 4.2及更高版本的java.TIME对象。最好与数据库交换对象,而不仅仅是字符串
myPreparedStatement.setObject( … , ldt ) ;
……还有
LocalDateTime ldt = myResultSet.getObject( … , LocalDateTime.class ) ;
LocalDateTime ldt = myResultSet.getObject( … , ZonedDateTime.class ) ;
Instant instant = myResultSet.getObject( … , Instant.class ) ;
ZonedDateTime zdt = instant.atZone( z ) ;
分区
如果您的业务问题确实需要偏移或分区,则必须指定以获取时间线上的实际点
一天中的第一个时刻并不总是00:00:00。异常情况,例如,一天可能在另一个时间开始,例如01:00:00。让java.time通过调用来确定一天中的第一个时刻
zdt.toString():2015-02-05T00:00+01:00[非洲/突尼斯]
如上所示,将java.time对象与数据库交换。如果试图记录历史中的实际时刻,则数据库列的类型应与SQL标准时区时间戳的类型相同
myPreparedStatement.setObject( … , zdt ) ;
……还有
LocalDateTime ldt = myResultSet.getObject( … , LocalDateTime.class ) ;
LocalDateTime ldt = myResultSet.getObject( … , ZonedDateTime.class ) ;
Instant instant = myResultSet.getObject( … , Instant.class ) ;
ZonedDateTime zdt = instant.atZone( z ) ;
您的驱动程序和/或数据库可能会将此类分区值转换为UTC值。或者你可以自己明确地这样做。提取始终以UTC为单位的即时
对象
myPreparedStatement.setObject( … , zdt.toInstant() ) ;
……还有
LocalDateTime ldt = myResultSet.getObject( … , LocalDateTime.class ) ;
LocalDateTime ldt = myResultSet.getObject( … , ZonedDateTime.class ) ;
Instant instant = myResultSet.getObject( … , Instant.class ) ;
ZonedDateTime zdt = instant.atZone( z ) ;
关于java.time
该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&
该项目现已启动,建议迁移到类
要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是
您可以直接与数据库交换java.time对象。使用兼容的或更高版本。不需要字符串,也不需要java.sql.*
类
从哪里获得java.time类
- ,及以后
- 内置的李>
- 标准JavaAPI的一部分,带有捆绑实现
- Java9添加了一些次要功能和修复
- 及
- 大部分java.time功能都在中向后移植到Java6和Java7
-
- 更高版本的Android捆绑包实现了java.time类
- 对于早期的Android(仅供参考),该项目现在正在进行中,建议迁移到类。请参阅。