将Joda LocalDate或java.util.Date转换为在当天开始时有时间的LocalDateTime

时间:2015-02-05 10:28:36

标签: java datetime jodatime

我正在使用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

2 个答案:

答案 0 :(得分:2)

一旦你摆脱了时区异常,你可以假设每天都在午夜开始,所以请使用:

LocalDateTime localDateTime = localDate.toLocalDateTime(LocalTime.MIDNIGHT);

目前尚不清楚为什么你想在1秒过去午夜结束。如果您真的想要,请创建自己的常量LocalTime来表示,并在上面的代码中使用它代替MIDNIGHT

另请注意,如果您确实获得了Date,则可能已经丢失了信息。听起来传入的数据实际上是一个字符串 - 您最好直接将其解析为LocalDate,以避免时区可能导致问题。

答案 1 :(得分:0)

TL;博士

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.
) ;

java.time

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.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance 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的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore