繁体   English   中英

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

[英]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以避免时区可能引起问题。

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项目现在处于维护模式 ,团队建议迁移到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.time框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧的旧式日期时间类,例如java.util.DateCalendarSimpleDateFormat

现在处于维护模式Joda-Time项目建议迁移到java.time类。

要了解更多信息,请参见Oracle教程 并在Stack Overflow中搜索许多示例和说明。 规格为JSR 310

您可以直接与数据库交换java.time对象。 使用与JDBC 4.2或更高版本兼容的JDBC驱动程序 不需要字符串,不需要java.sql.*类。

在哪里获取java.time类?

  • Java SE 8Java SE 9和更高版本
    • 内置。
    • 标准Java API的一部分,具有捆绑的实现。
    • Java 9添加了一些次要功能和修复。
  • Java SE 6Java SE 7
    • java.time的许多功能在ThreeTen- Backport中都被反向移植到Java 6和7。
  • Android的
    • 更高版本的Android捆绑了java.time类的实现。
    • 对于早期的Android(<26), ThreeTenABP项目改编了ThreeTen-Backport (如上所述)。 请参阅如何使用ThreeTenABP…

ThreeTen-Extra项目使用其他类扩展了java.time。 该项目为将来可能在java.time中添加内容提供了一个试验场。 您可以在这里找到一些有用的类,比如IntervalYearWeekYearQuarter ,和更多

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM