对于给定的 Date 对象,捕获其与 GMT 时区相关的值

在 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 对象)打印本地时区的值。


PS:我的最终目标是在 java.sql.TimeStamp 对象中拥有 GMT 值。


如何才能实现这一目标?


更新 1: 查看评论和回复后,我了解到 Date 对象只保存一个包含毫秒的长值。 但是,我的期望是,当执行此行时:


Date gmtDate = Date.from(gmtTime.toInstant());

无论对象gmtTime包含什么时间,我都需要在 TimeStamp 或 Date 对象中捕获该时间。动机是能够与数据库中保存的值进行比较。我将日期作为参数传递给我的 SQL 查询。


有人可以帮我理解如何实现这一点吗?


慕桂英546537
浏览 153回答 3
3回答

MMMHUHU

java.time 和 JDBC 4.2使用OffsetDateTime。    PreparedStatement yourPreparedStatement = yourDatabaseConnection.prepareStatement(            "select smth from your_table where your_time_stamp_col < ?;");    OffsetDateTime gmtTime = OffsetDateTime.now(ZoneOffset.UTC);    yourPreparedStatement.setObject(1, gmtTime);这需要一个兼容 JDBC 4.2 的 JDBC 驱动程序,我认为现在我们所有人都在使用它。这很好,因为它允许我们绕过java.sql.Timestamp中的其他日期时间类型java.sql。它们的设计都很糟糕并且早已过时。正如其他人所说,这两个类都不是过时的Date,也Timestamp没有任何时区或与 UTC/GMT 的偏移。

长风秋雁

首先,Date类是旧的过时的(没有双关语)基础设施的一部分。如果可能的话,摆脱它并只使用java.time包。但如果您必须使用,Date那么您的时区问题就不是问题。您的线路System.out.println(gmtDate);仅使用您的本地时区打印它,因为系统假定它是最佳选择。但无论如何,Date自 1970 年 1 月 1 日 00:00:00 GMT 以来的特定时刻(以毫秒为单位)。类具有compareTo()、after()和before()Date方法,可让您比较2 个日期。还有方法getTime()Date返回此日期表示的自 1970 年 1 月 1 日 00:00:00 GMT 以来的毫秒数。这样您就可以比较这些long值。但同样,最好的选择是切换到java.time包和类Instant和ZonedDateTime(和其他)有方法compareTo()、isAfter() 和 isBefore()。

收到一只叮咚

您误解了日期时间类的语义。java.util.Date是一个特定的时间点,一个瞬间,它没有与之关联的时区。但是,如果您有时区,您可以询问时区的时间java.util.Date。java.sql.TimeStamp相当于java.time.LocalDateTime.&nbsp;它不是一个瞬间,也没有与之关联的时区。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java