我正在使用Joda 2.5
将Joda LocalDate转换为LocalDateTime时遇到问题。
因为,我可以使用Time atStartOfDay将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
答案 0 :(得分:2)
一旦你摆脱了时区异常,你可以假设每天都在午夜开始,所以请使用:
LocalDateTime localDateTime = localDate.toLocalDateTime(LocalTime.MIDNIGHT);
目前尚不清楚为什么你想在1秒过去午夜结束。如果您真的想要,请创建自己的常量LocalTime
来表示,并在上面的代码中使用它代替MIDNIGHT
。
另请注意,如果您确实获得了Date
,则可能已经丢失了信息。听起来传入的数据实际上是一个字符串 - 您最好直接将其解析为LocalDate
,以避免时区可能导致问题。
答案 1 :(得分:0)
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项目现在位于maintenance mode,团队建议迁移到java.time课程。请参阅Tutorial by Oracle。
解析输入字符串
LocalDate ld = LocalDate.parse( "2015-02-05" ) ;
如果您的业务问题缺少任何来自UTC或时区的偏移,不时间线上的特定时刻,那么通过转换为a,获取通用24小时日的第一个时刻LocalDateTime
。
LocalDateTime ldt = ld.atStartOfDay() ;
ldt.toString():2015-02-05T00:00
要将此数据类型存储在数据类型为TIMESTAMP WITHOUT TIME ZONE
的SQL标准类型的列中,请使用符合JDBC 4.2及更高版本的JDBC driver的java.time对象。最好用数据库而不仅仅是字符串来交换对象。
myPreparedStatement.setObject( … , ldt ) ;
...和...
LocalDateTime ldt = myResultSet.getObject( … , LocalDateTime.class ) ;
如果您的业务问题确实涉及偏移或区域,则必须指定在时间线上获取实际点。
一天的第一时刻并不总是00:00:00。诸如Daylight Saving Time (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及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*
类。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。