【问题标题】:Java Date and TimestampJava 日期和时间戳
【发布时间】:2013-11-03 20:53:14
【问题描述】:

考虑这段代码:-

        String t = "2013-10-05 09:10:37.029074";
        Timestamp ts = Timestamp.valueOf(t);

        Date d = new Date(ts.getTime());
        Timestamp ts2 = new java.sql.Timestamp(d.getTime());
        System.out.println("ts -->"+ts);
        System.out.println("ts2-->"+ts2);

当我运行它时,我得到的结果是。

ts -->2013-10-05 09:10:37.029074           ts2-->2013-10-05 09:10:37.029

我不想忽略 misecods(请参阅 029074 和 029 之间的差异)。它似乎是四舍五入的。

我什至想保留分数。

【问题讨论】:

  • 如果您必须保持微秒精度,您是否有特定原因必须使用Dates?
  • 看那里 - 我希望它可以帮助stackoverflow.com/questions/1712205/…
  • 你不想忽略的(074) 实际上是微秒部分。 029 是毫秒部分。

标签: java date timestamp


【解决方案1】:

Date 类只有毫秒精度。它不能存储更高的精度。

Javadocs for Date:

Date 类表示特定的时间瞬间,精度为毫秒。

【讨论】:

    【解决方案2】:

    Timestamp 具有 nanosecond 精度。 java.sql.Date 和 java.util.Date 都只有毫秒精度。一旦您将Date 带入游戏中,您将失去精确度。

    所以只需保留Timestamp 并使用getTime 抓住它的毫秒数来做你需要做的任何事情,但请确保你抓住它。

    【讨论】:

      【解决方案3】:

      tl;博士

      麻烦的Date 和Timestamp 类现在都替换为java.time.Instant。

      Instant.now() 
             .toString()
      

      2018-04-04T21:33:37.889228Z

      java.time

      Answer by Vidya 和 by rgettman 都是正确的,您已经遇到了这些类中设计的限制。

      此外,这些课程很麻烦、令人困惑且有缺陷。它们已被 java.time 类所取代。无需再次使用java.util.Date 或java.sql.Timestamp。

      java.util.Date 类代表 UTC 时间线上的时刻,分辨率为 milliseconds。该类现在被java.time.Instant 取代,也是UTC 中的一个时刻,但具有更精细的nanoseconds 分辨率。

      Instant instant = Instant.now() ;
      

      特别是在 Java 8 中,捕获当前时刻被限制为毫秒,尽管 Instant 类能够保持纳秒。在 Java 9 及更高版本中,Clock 的全新实现允许以更精细的分辨率捕获当前时刻,尽管受到主机操作系统和硬件能力的限制。在 macOS Sierra 上的 Oracle JDK 9.0.4 中,我看到了微秒

      Instant.now().toString(): 2018-04-04T21:33:37.889228Z

      从 JDBC 4.2 及更高版本开始,java.sql.Timestamp 类也被 Instant 替换。您现在可以直接交换 java.time 类,而无需考虑 java.sql 类型。

      myPreparedStatement.setObject( … , instant ) ;
      

      ……和……

      Instant instant = myResultSet.getObject( … , Instant.class ) ;
      

      关于java.time

      java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.Date、Calendar 和 SimpleDateFormat。

      Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

      要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310。

      您可以直接与您的数据库交换 java.time 对象。使用符合JDBC 4.2 或更高版本的JDBC driver。不需要字符串,不需要java.sql.* 类。

      从哪里获得 java.time 类?

      • Java SE 8、Java SE 9 及更高版本
        • 内置。
        • 标准 Java API 的一部分,带有捆绑实现。
        • Java 9 添加了一些小功能和修复。
      • Java SE 6 和 Java SE 7
        • ThreeTen-Backport 中的大部分 java.time 功能都向后移植到 Java 6 和 7。
      • Android
        • java.time 类的 Android 捆绑包实现的更高版本。
        • 对于早期的 Android (ThreeTenABP 项目采用 ThreeTen-Backport(如上所述)。见How to use ThreeTenABP…。

      ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如Interval、YearWeek、YearQuarter 和more。

      【讨论】:

        猜你喜欢
        • 2014-05-22
        • 1970-01-01
        • 1970-01-01
        • 2012-06-18
        • 2013-03-02
        • 2013-06-16
        • 2015-02-26
        • 2013-07-28
        • 2011-03-20
        相关资源
        最近更新 更多