java.time
我正在提供现代答案。 Timestamp 类的设计总是很糟糕,这是对已经设计得很糟糕的Date 类的真正破解。这两个类现在都已经过时了。不要使用它们。
当被问到问题时,您需要Timestamp 来向 SQL 数据库发送一个时间点。从 JDBC 4.2 开始,情况不再如此。假设您的数据库需要 timestamp with time zone(推荐用于真正的时间戳),请将其传递给 OffsetDateTime。
在我们这样做之前,我们需要解决您的示例字符串Mon May 27 11:46:15 IST 2013:时区缩写的真正问题。 IST 可能表示爱尔兰夏令时间、以色列标准时间或印度标准时间(我什至读过 Java 可能会将其解析为大西洋/雷克雅未克时区 - 冰岛标准时间?)为了控制解释,我们将首选时区传递给我们用于解析的格式化程序。
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.appendPattern("EEE MMM dd HH:mm:ss ")
.appendZoneText(TextStyle.SHORT, Set.of(ZoneId.of("Asia/Kolkata")))
.appendPattern(" yyyy")
.toFormatter(Locale.ROOT);
String dateString = "Mon May 27 11:46:15 IST 2013";
OffsetDateTime dateTime = formatter.parse(dateString, Instant::from)
.atOffset(ZoneOffset.UTC);
System.out.println(dateTime);
这个 sn-p 打印:
2013-05-27T06:16:15Z
这是您的字符串的 UTC 等效值(假设 IST 是印度标准时间)。使用PreparedStatement.setObject 方法之一(不是setTimestamp)将OffsetDateTime 传递到您的数据库。
如何将其转换为时间戳并以秒为单位计算
同一时间和当前时间的区别?
使用 java.time 非常自然地计算以秒为单位的差异:
long differenceInSeconds = ChronoUnit.SECONDS
.between(dateTime, OffsetDateTime.now(ZoneOffset.UTC));
System.out.println(differenceInSeconds);
刚刚运行时我得到了:
202213260
链接: Oracle tutorial: Date Time 解释如何使用 java.time。