将 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 时遇到问题。

因为,我能够将 LocalDate 转换为 DateTime,Time atStartOfDay。我想要相同的功能,但通过 LocalDateTime 对象。

我的代码是:

Suppose Date is coming from different REST service , say

Date currentDate = new Date("2015-02-05");

And now this Date is passed to some another service as shown below :

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 project is now in maintenance mode, with the team advising migration to the java.time classes. See Tutorial by Oracle.

解析您的输入字符串

LocalDate ld = LocalDate.parse( "2015-02-05" ) ;

未分区

如果您的业务问题缺少任何与 UTC 或时区的偏移量,不是时间轴上的特定时刻,则获取通用 24 小时制的第一个时刻通过转换为 LocalDateTime 天。

LocalDateTime ldt = ld.atStartOfDay() ;

ldt.toString(): 2015-02-05T00:00

要将其存储在数据库中数据类型类似于 TIMESTAMP WITHOUT TIME ZONE 的 SQL 标准类型的列中,请使用具有 JDBC driver 的 java.time 对象JDBC 4.2 及更高版本。最好与数据库交换对象,而不仅仅是字符串。

myPreparedStatement.setObject( … , ldt ) ;

……和……

LocalDateTime ldt = myResultSet.getObject( … , LocalDateTime.class ) ;

分区

如果您的业务问题确实涉及偏移量或区域,您必须指定以获取时间轴上的实际点。

一天的第一时刻并不总是 00:00:00。 Daylight Saving Time (DST) mean the day may begin at another time such as 01:00:00. Let java.time determine the first moment of the day with a call to LocalDate::atStartOfDay等异常。

ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = ld.atStartOfDay( z ) ;

zdt.toString(): 2015-02-05T00:00+01:00[Africa/Tunis]

与您的数据库交换 java.time 对象,如上所示。如果你想记录历史上的真实时刻,你的数据库列应该是等同于 SQL 标准 TIMESTAMP WITH TIME ZONE.

的类型
myPreparedStatement.setObject( … , zdt ) ;

……和……

LocalDateTime ldt = myResultSet.getObject( … , ZonedDateTime.class ) ;

您的驱动程序 and/or 数据库可能会将此类分区值转换为 UTC 值。或者您可以自己明确地这样做。提取一个始终使用 UTC 的 Instant 对象。

myPreparedStatement.setObject( … , zdt.toInstant() ) ;

……和……

Instant instant = myResultSet.getObject( … , Instant.class ) ;
ZonedDateTime zdt = instant.atZone( z ) ;

关于java.time

java.time framework is built into Java 8 and later. These classes supplant the troublesome old legacy date-time classes such as java.util.Date, Calendar, & SimpleDateFormat.

Joda-Time project, now in maintenance mode, advises migration to the java.time 类.

要了解更多信息,请参阅 Oracle Tutorial. And search Stack Overflow for many examples and explanations. Specification is JSR 310

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

java.time类在哪里获取?

  • Java SE 8, Java SE 9,及以后
    • 内置。
    • 标准 Java API 的一部分,带有捆绑实施。
    • Java 9 添加了一些小功能和修复。
  • Java SE 6 and Java SE 7
  • Android
    • Android java.time 类.
    • 捆绑实施的更高版本
    • 对于较早的 Android (<26),ThreeTenABP project adapts ThreeTen-Backport (mentioned above). See

ThreeTen-Extra project extends java.time with additional classes. This project is a proving ground for possible future additions to java.time. You may find some useful classes here such as Interval, YearWeek, YearQuarter, and more.