[英]Convert Joda LocalDate or java.util.Date to LocalDateTime having time at Start of the Day
我正在使用Joda 2.5
将Joda LocalDate转换为LocalDateTime时遇到问题。
作为,我能够将TimeDateTime的LocalDate转换为DateTime。 我想要相同的功能,但要通过LocalDateTime对象。
我的代码是:
假设Date来自不同的REST服务,例如
Date currentDate = new Date("2015-02-05");
现在,此日期将传递到其他服务,如下所示:
funService(currentDate);
public funService(Date currentDate)
{
LocalDate localDateObject = new LocalDate(date);
// Now I have to convert this Date to LocalDateTime
LocalDateTime localDateTime = localDateObject.toDateTimeAtStartOfDay();
//But this returns DateTime Object.
// As I don't want to store the DateTime Object because it also stores the TimeZone
}
我想要LocalDateTime对象,因为我将此LocalDateTime作为时间戳存储在mysql中。
请提供将LocalDate转换为LocalDateTime对象的解决方案。
例如:'2015-02-01'至'2015-02-01 00:00:01'YYYY-MM-DD至YYYY-MM-DD HH:MM:SS:zzz
但不是LocalDate到DateTime
好了,一旦您摆脱了时区异常,就可以假设每天都是从午夜开始,因此请使用:
LocalDateTime localDateTime = localDate.toLocalDateTime(LocalTime.MIDNIGHT);
为什么你想以1秒过了午夜,结束了目前尚不清楚。 如果确实需要,请创建自己的常量LocalTime
表示该常量,并在上面的代码中使用它代替MIDNIGHT
。
另请注意,如果您实际上有一个Date
,那么您可能已经丢失了信息。 听起来传入的数据确实是一个字符串-最好直接将其解析为LocalDate
以避免时区可能引起问题。
myPreparedStatement.setObject( // Insert object into database for `TIMESTAMP WITHOUT TIME ZONE` type of column.
… ,
LocalDate.parse( "2015-02-05" ) // Parse input string to a date-only value lacking time-of-day and lacking time zone.
.atStartOfDay() // Determine start of a generic 24-hour day for a `LocalDateTime` object lacking offset-from-UTC and lacking time zone.
) ;
Joda-Time项目现在处于维护模式 ,团队建议迁移到java.time类。 请参见Oracle教程 。
解析您的输入字符串
LocalDate ld = LocalDate.parse( "2015-02-05" ) ;
如果您的业务问题缺少任何与UTC的偏移量或时区,而不是时间轴上的特定时刻,则可以通过转换为LocalDateTime
来获取24小时全天的第一时刻。
LocalDateTime ldt = ld.atStartOfDay() ;
ldt.toString():2015-02-05T00:00
要将其存储在数据库中类似SQL标准类型的TIMESTAMP WITHOUT TIME ZONE
的数据类型的列中,请将java.time对象与兼容JDBC 4.2及更高版本的JDBC驱动程序一起使用。 最好与数据库交换对象,而不是单纯的字符串。
myPreparedStatement.setObject( … , ldt ) ;
…和…
LocalDateTime ldt = myResultSet.getObject( … , LocalDateTime.class ) ;
如果您的业务问题确实需要偏移量或区域,则必须指定在时间轴上获得实际点。
一天的第一时刻并不总是00:00:00。 诸如夏令时(DST)之类的异常表示一天可能在另一个时间(例如01:00:00)开始。 让java.time通过调用LocalDate::atStartOfDay
来确定一天的第一时刻。
ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = ld.atStartOfDay( z ) ;
zdt.toString():2015-02-05T00:00 + 01:00 [非洲/突尼斯]
如上所述,将java.time对象与数据库交换。 如果您试图记录历史中的实际时刻,则数据库列的类型应与SQL标准TIMESTAMP WITH TIME ZONE
等效。
myPreparedStatement.setObject( … , zdt ) ;
…和…
LocalDateTime ldt = myResultSet.getObject( … , ZonedDateTime.class ) ;
您的驱动程序和/或数据库可能会将此类分区值转换为UTC值。 或者,您可以自己明确地这样做。 提取始终位于UTC中的Instant
对象。
myPreparedStatement.setObject( … , zdt.toInstant() ) ;
…和…
Instant instant = myResultSet.getObject( … , Instant.class ) ;
ZonedDateTime zdt = instant.atZone( z ) ;
java.time框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧的旧式日期时间类,例如java.util.Date
, Calendar
和SimpleDateFormat
。
现在处于维护模式的Joda-Time项目建议迁移到java.time类。
要了解更多信息,请参见Oracle教程 。 并在Stack Overflow中搜索许多示例和说明。 规格为JSR 310 。
您可以直接与数据库交换java.time对象。 使用与JDBC 4.2或更高版本兼容的JDBC驱动程序 。 不需要字符串,不需要java.sql.*
类。
在哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展了java.time。 该项目为将来可能在java.time中添加内容提供了一个试验场。 您可以在这里找到一些有用的类,比如Interval
, YearWeek
, YearQuarter
,和更多 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.