我将日期时间字符串格式从其他格式转换为Timestamp(java.sql)。我已经根据不同的格式将其转换为LocalDateTime。反正有将LocalDateTime对象转换为Timestamp吗?
答案 0 :(得分:2)
它比您想像的还要精致,您问得很好。
由于可以使用现代Java日期和时间API java.time,因此,您也不希望应用老式且设计不良的Timestamp
类。
我假设您要的是Timestamp
,因为您需要一些可以存储到类型timestamp
(无时区)的SQL数据库列中的东西。请允许我提及,在大多数情况下,您都不需要此类专栏。标准SQL数据类型timestamp
的名称不正确。时间戳记的概念是,它应该标识出发生某事的明确时间点,而SQL timestamp
不会 not 定义这样的时间点。它定义了一天中的日期和时间,任何人都可以在任何时区自由地解释它,允许有大约26小时的变化。相反,您应该使用timestamp with timezone
。它也不符合其名称,因为它不允许您选择时区。它以UTC格式存储时间,因此可以确定唯一的时间点。
在Java端,使用OffsetDateTime
来存储到timestamp with timezone
列中。由于您拥有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进行编程,情况将变得更加复杂。 Timestamp
确实定义了一个时间点。因此,您现在需要从未定义时间点的LocalDateTime
转换为确实定义时间点的Timestamp
,然后将Timestamp
传递到可以存储它的API在数据库列中,该列又未定义明确的时间点。您将需要确定哪个时区用于转换,并且仍然可能会出现一些失败的案例,或者(更糟糕的)结果不正确。但是,正如the_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);
答案 1 :(得分:0)
使用内置类的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());
}
}