将 LocalDate 转换为 LocalDateTime 或 java.sql.Timestamp

我正在使用 JodaTime1.6.2。

我有一个 LocalDate,我需要转换为(Joda) LocalDateTime,或 java.sqlTimestamp的地图。

原因是我已经知道如何在 LocalDateTimejava.sql.Timestamp之间进行转换:

LocalDateTime ldt = new LocalDateTime();
DateTimeFormatter dtf = DateTimeFormatter.forPattern("yyyy-MM-dd HH:mm:ss");
Timestamp ts = Timestamp.valueOf(ldt.toString(dtf));

因此,如果我可以只转换之间的 LocalDateLocalDateTime,那么我可以继续转换到 java.sql.Timestamp。谢谢你在正确的方向上的推动!

281372 次浏览

JodaTime

要将 JodaTime 的 org.joda.time.LocalDate转换为 java.sql.Timestamp,只需执行以下操作

Timestamp timestamp = new Timestamp(localDate.toDateTimeAtStartOfDay().getMillis());

要将 JodaTime 的 org.joda.time.LocalDateTime转换为 java.sql.Timestamp,只需执行以下操作

Timestamp timestamp = new Timestamp(localDateTime.toDateTime().getMillis());

JavaTime

要将 Java8的 java.time.LocalDate转换为 java.sql.Timestamp,只需执行以下操作

Timestamp timestamp = Timestamp.valueOf(localDate.atStartOfDay());

要将 Java8的 java.time.LocalDateTime转换为 java.sql.Timestamp,只需执行以下操作

Timestamp timestamp = Timestamp.valueOf(localDateTime);

根据你的时区,你可能会失去几分钟(1650-01-0100:00:00:00变成1649-12-3123:52:58)

使用下面的代码可以避免这种情况

new Timestamp(localDateTime.getYear() - 1900, localDateTime.getMonthOfYear() - 1, localDateTime.getDayOfMonth(), localDateTime.getHourOfDay(), localDateTime.getMinuteOfHour(), localDateTime.getSecondOfMinute(), fractional);

使用 Java8 time API 的最佳方法:

  LocalDateTime ldt = timeStamp.toLocalDateTime();
Timestamp ts = Timestamp.valueOf(ldt);

为了与 JPA 一起使用,请与您的型号(https://weblogs.java.net/blog/montanajava/archive/2014/06/17/using-java-8-datetime-classes-jpa)一起使用:

@Converter(autoApply = true)
public class LocalDateTimeConverter implements AttributeConverter<LocalDateTime, Timestamp> {
@Override
public Timestamp convertToDatabaseColumn(LocalDateTime ldt) {
return Timestamp.valueOf(ldt);
}


@Override
public LocalDateTime convertToEntityAttribute(Timestamp ts) {
return ts.toLocalDateTime();
}
}

所以现在是相对时区独立时间。 此外,这也很容易做到:

  LocalDate ld = ldt.toLocalDate();
LocalTime lt = ldt.toLocalTime();

格式:

 DateTimeFormatter DATE_TME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")
String str = ldt.format(DATE_TME_FORMATTER);
ldt = LocalDateTime.parse(str, DATE_TME_FORMATTER);

更新: postgres 9.4.1208,HSQLDB2.4.0等理解 Java8时间 API 没有任何会话!

由于 Joda 正在消失,有人可能希望在 Java8中将 LocaltDate转换为 LocalDateTime。在 Java8LocalDateTime中,它将提供一种使用 LocalDateLocalTime创建 LocalDateTime实例的方法。检查 给你。

的公共静态 LocalDateTime (LocalDate, 本地时间)

样本是,

    // just to create a sample LocalDate
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDate ld = LocalDate.parse("20180306", dtf);


// convert ld into a LocalDateTime
// We need to specify the LocalTime component here as well, it can be any accepted value
LocalDateTime ldt = LocalDateTime.of(ld, LocalTime.of(0,0)); // 2018-03-06T00:00

只是为了参考,为了得到下面的纪元秒可以使用,

    ZoneId zoneId = ZoneId.systemDefault();
long epoch = ldt.atZone(zoneId).toEpochSecond();


// If you only care about UTC
long epochUTC = ldt.toEpochSecond(ZoneOffset.UTC);

博士

尤达时间项目处于维护模式,现在被 爪哇时间类所取代。

  • 只需使用 java.time.Instant 类。
  • 不需要:
    • LocalDateTime
    • java.sql.Timestamp
    • 绳子

以协调世界时捕获当前时刻。

Instant.now()

要在数据库中存储该时刻:

myPreparedStatement.setObject( … , Instant.now() )  // Writes an `Instant` to database.

要从数据库中检索该时刻:

myResultSet.getObject( … , Instant.class )  // Instantiates a `Instant`

将挂钟时间调整为特定时区的时间。

instant.atZone( z )  // Instantiates a `ZonedDateTime`

LocalDateTime是错误的类

其他答案是正确的,但他们没有指出,LocalDateTime是错误的类为您的目的。

爪哇时间Joda 时间中,LocalDateTime故意缺少任何时区或从 UTC 偏移的概念。因此,它确实 没有代表一个时刻,是 没有在时间线上的一个点。LocalDateTime代表了一个关于 潜力时刻的大致概念,大约在26-27小时的范围内。

如果区域/偏移量未知(情况不妙) ,或者区域偏移量不确定,则使用 LocalDateTime。例如,“2018年12月25日第一时刻圣诞节开始”将被表示为 LocalDateTime

使用 ZonedDateTime表示特定时区中的某个时刻。例如,从任何特定区域(如 Pacific/AucklandAmerica/Montreal)开始的圣诞节将用 ZonedDateTime对象表示。

有一段时间总是使用 UTC,使用 Instant

Instant instant = Instant.now() ;  // Capture the current moment in UTC.

应用一个时区。同样的时间,同样的时间线上的点,但看到一个不同的挂钟时间。

ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;  // Same moment, different wall-clock time.

如果我能在 LocalDate 和 LocalDateTime 之间转换,

不,错误的策略。如果只有日期值,并且需要日期时间值,则必须指定一天中的时间。这个时间段可能不适用于特定区域,在这种情况下,ZonedDateTime类会根据需要自动调整时间段。

LocalDate ld = LocalDate.of( 2018 , Month.JANUARY , 23 ) ;
LocalTime lt = LocalTime.of( 14 , 0 ) ;  // 14:00 = 2 PM.
ZonedDateTime zdt = ZonedDateTime.of( ld , lt , z ) ;

如果你想把一天中的第一个时刻作为一天中的第一个时刻,让 爪哇时间来决定这个时刻。不要以为今天是0:00:00开始。夏时制等异常现象意味着一天可能在另一个时间开始,比如01:00:00。

ZonedDateTime zdt = ld.atStartOfDay( z ) ;

java.sql.Timestamp是错误的类

java.sql.Timestamp是令人烦恼的旧日期时间类的一部分,这些类现在已经被遗留下来,完全被 爪哇时间类所取代。这个类被用来表示 协调世界时中分辨率为 纳秒的一个时刻。这个目的现在与 java.time.Instant一起实现。

带有 getObject/setObject的 JDBC 4.2

JDBC 4.2和更高版本中,您的 JDBC 驱动程序可以通过调用以下命令直接与数据库交换 java.time 对象:

例如:

myPreparedStatement.setObject( … , instant ) ;

还有..。

Instant instant = myResultSet.getObject( … , Instant.class ) ;

转换遗产 something 现代

如果您必须使用尚未更新到 爪哇时间的旧代码进行接口,请使用添加到旧类中的新方法来来回回地进行转换。

Instant instant = myJavaSqlTimestamp.toInstant() ;  // Going from legacy class to modern class.

还有..。

java.sql.Timestamp myJavaSqlTimestamp = java.sql.Timestamp.from( instant ) ;  // Going from modern class to legacy class.

关于 爪哇时间

< em > java.time 框架内置于 Java8及更高版本中。这些类取代了令人讨厌的旧的 遗产日期时间类,如 java.util.DateCalendarSimpleDateFormat

现在在 维修模式中的 尤达时间项目建议迁移到 爪哇时间类。

要了解更多,请参阅 < em > Oracle 教程 。并搜索堆栈溢出许多例子和解释。规范是 JSR 310

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

从哪里获得 java.time 类?

  • Java SE 8 < strong > JavaSE9 和更高版本
    • 内置的。
    • 带有捆绑实现的标准 JavaAPI 的一部分。
    • Java9添加了一些次要的特性和修复。
  • Java SE 6 和 < a href = “ https://en.wikipedia.org/wiki/Java _ version _ history # Java _ SE _ 7”rel = “ noReferrer”> < strong > Java SE 7
  • 仿生人
    • Java.time 类的 Android 捆绑包实现的后续版本。
    • 对于早期的 Android (< 26) ,项目适用于 310-后端口(上面提到过)。

< strong > Three Ten-Ultra 项目使用其他类扩展 java.time。这个项目是将来可能添加 java.time 的试验场。您可以在这里找到一些有用的类,比如 IntervalYearWeekYearQuarter更多

Java8 +

import java.time.Instant;
Instant.now().getEpochSecond(); //timestamp in seconds format (int)
Instant.now().toEpochMilli(); // timestamp in milliseconds format (long)

函数调用 java.time.LocalDate对象上的 asStartOfDay()返回一个 java.time.LocalDateTime对象