为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕桂英546537 2023-07-13 15:49:45
在 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 查询。有人可以帮我理解如何实现这一点吗?
查看完整描述

3 回答

?
MMMHUHU

TA贡献1834条经验 获得超8个赞

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 的偏移。


查看完整回答
反对 回复 2023-07-13
?
长风秋雁

TA贡献1757条经验 获得超7个赞

首先,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()。



查看完整回答
反对 回复 2023-07-13
?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

您误解了日期时间类的语义。java.util.Date是一个特定的时间点,一个瞬间,它没有与之关联的时区。但是,如果您有时区,您可以询问时区的时间java.util.Date

java.sql.TimeStamp相当于java.time.LocalDateTime. 它不是一个瞬间,也没有与之关联的时区。


查看完整回答
反对 回复 2023-07-13
  • 3 回答
  • 0 关注
  • 110 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信