【发布时间】:2019-09-05 15:11:42
【问题描述】:
在我在 Java 8 上运行的应用程序中,我有一个 Date 对象。此对象的时区取决于客户端的位置。
在某个特定点,我需要将此日期转换为 GMT,以便它可以与我从数据库访问的值进行比较。
我尝试了 SimpleDateFormat 和 ZonedDateTime,但有一个痛点。这些 API 为我提供了字符串值的 GMT 时间,这非常好。但是,一旦我解析它并将其分配给 Date 对象,它就会回到我的本地时区!
例如:
public class TimeZoneDemo {
public static void main(String[] args) throws ParseException {
Date istDate = Calendar.getInstance().getTime();
ZonedDateTime gmtTime = istDate.toInstant().atZone(ZoneId.of("GMT"));
System.out.println(gmtTime);
Date gmtDate = Date.from(gmtTime.toInstant());
System.out.println(gmtDate);
}
}
在上面的代码中,gmtTime 显示与 GMT 时区相关的正确值,但 gmtDate ( Date 对象)在本地时区打印值。
P.S.:我的最终目标是在 java.sql.TimeStamp 对象中包含 GMT 值。
如何做到这一点?
更新 1: 在浏览完 cmets 和回复后,我了解到 Date 对象只包含一个包含毫秒的长值。 但是,我的期望是当这条线被执行时:
Date gmtDate = Date.from(gmtTime.toInstant());
无论对象 gmtTime 包含什么时间,我都需要在 TimeStamp 或 Date 对象中捕获该时间。这样做的目的是为了能够与数据库中保存的值进行比较。我将日期作为参数传递给我的 SQL 查询。
有人可以帮助我了解如何实现吗?
【问题讨论】:
-
“但是,一旦我解析它并将其分配给 Date 对象,它就会回到我的本地时区!”并不真地。日期对象不在任何时区“内”。它们只是代表时间的瞬间。见codeblog.jonskeet.uk/2017/04/23/all-about-java-util-date
-
总是,甚至在使用 Java 8(或更高版本)时更是如此,避免使用
Date和Timestamp类。它们设计不佳且早已过时。使用java.time, the modern Java date and time API。 -
与数据库中持久化的值进行比较 — 如 in 相等还是之前或之后?您更喜欢用 SQL 还是 Java 进行比较?我相信我们可以提供帮助。
-
无需再使用
java.sql.TimeStamp。在 JDBC 4.2 及更高版本中替换为OffsetDateTime。myPreparedStatement.setObject( … , OffsetDateTime.now( ZoneOffset.UTC ) ) ;和OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;。同样,永远不要再使用java.util.Date或java.util.Calendar。多年前采用 JSR 310 时被 java.time 取代。 -
@OleV.V.:我将日期作为参数传递给我的 SQL 查询
标签: java java-8 zoneddatetime sql-timestamp