Java 将LocalDateTime转换为时间戳格式

Java 将LocalDateTime转换为时间戳格式,java,Java,Im将日期时间字符串格式从不同格式转换为时间戳(java.sql)。我已经根据不同的格式将其转换为LocalDateTime。是否仍有将LocalDateTime对象转换为时间戳的方法?使用java 8内置类进行尝试 public class Test { public static void main(String[] args) { Timestamp timestamp = Timestamp.valueOf(LocalDateTime.now());

Im将日期时间字符串格式从不同格式转换为时间戳(java.sql)。我已经根据不同的格式将其转换为LocalDateTime。是否仍有将LocalDateTime对象转换为时间戳的方法?

使用java 8内置类进行尝试

public class Test {
    public static void main(String[] args) {
        Timestamp timestamp = Timestamp.valueOf(LocalDateTime.now());
        // java timestamp class
        System.out.println(timestamp);
        // miliseconds 
        System.out.println(timestamp.getTime());
    }
}

它比你想象的更精致,你问得太好了


由于您可以使用java.time,即现代java日期和时间API,因此您不希望也应用老式且设计拙劣的
Timestamp

我假设您要求的是
时间戳
,因为您需要可以存储到
时间戳
类型(不带时区)的SQL数据库列中的内容。请允许我提一下,在大多数情况下,你不想要这样一个专栏。标准SQL数据类型
时间戳
与其名称不符。虽然时间戳的概念是它应该在事件发生时标识一个明确的时间点,但SQL
时间戳并不定义这样的时间点。它定义了一天中的日期和时间,任何人都可以在任何时区自由解释,允许大约26小时的变化。相反,对于时间点,您应该使用带有时区的时间戳。它也不符合它的名字,因为它不允许你选择时区。它以UTC格式存储时间,因此可以识别唯一的时间点

在Java端,使用
OffsetDateTime
存储到带有时区的
时间戳中。由于您有一个
LocalDateTime
,因此需要转换。对于转换,您需要知道
LocalDateTime
后面的时区。例如:

    final ZoneId zone = ZoneId.of("Asia/Tehran");
    LocalDateTime ldt = LocalDateTime.of(2019, 2, 25, 23, 45);
    OffsetDateTime odt = ldt.atZone(zone).toOffsetDateTime();

    System.out.println("As OffsetDateTime: " + odt);
截止日期时间:2019-02-25T23:45+03:30

存储到数据库中:

    PreparedStatement ps = yourDatabaseConnection.prepareStatement(
            "insert into your_table(your_ts_with_timezone) values (?)");
    ps.setObject(1, odt);
    ps.executeUpdate();
如果出于某种原因,您确实需要数据库中没有时区的时间戳,或者您无法更改它,那么您根本不需要任何转换。只需存储您拥有的
LocalDateTime

    PreparedStatement ps = yourDatabaseConnection.prepareStatement(
            "insert into your_table(your_ts_without_timezone) values (?)");
    ps.setObject(1, ldt);
如果您正在编程一个需要老式
java.sql.Timestamp
对象的遗留API,那么事情就变得更加复杂了。
时间戳
确实定义了一个时间点。因此,您现在需要将不定义时间点的
LocalDateTime
转换为定义时间点的
Timestamp
,然后将
Timestamp
传递给一个API,该API可以将其存储在一个数据库列中,而该数据库列也没有定义明确的时间点。您将需要确定转换使用的时区,但仍可能存在失败或(更糟)给出错误结果的极端情况。然而,正如_storyteller在评论中提到的,转换非常简单:

    Timestamp ts = Timestamp.valueOf(ldt);
    System.out.println("As old-fashioned Timestamp: " + ts);
作为老式时间戳:2019-02-25 23:45:00.0

转换使用JVM的默认时区。
TImestamp.toString()
也使用此设置,因此输出与预期一致。不过,这是不可靠的,因为JVM中运行的任何程序都可能随时更改默认时区设置,所以通常您不知道会得到什么。要控制用于转换的时区,请执行以下操作:

    Instant i = ldt.atZone(zone).toInstant();
    Timestamp ts = Timestamp.from(i);
链接

请参见,因为您可以使用java.time,即现代java日期和时间API,所以您不希望也应用老式且设计拙劣的
时间戳
类。如果您认为您的
PreparedStatement
需要一个,因为JDBC4.2不需要。只要给它你的
LocalDateTime
。比如
yourpreadstatement.setObject(4,yourLocalDateTime)
.FYI…提出了同样的问题,但是在使用java.time to java 6和7的后端口的上下文中,Three Ten Backport项目。