【问题标题】:Get number of years between two timestamp objects in Java获取Java中两个时间戳对象之间的年数
【发布时间】:2017-11-13 08:47:23
【问题描述】:

我有两个 timestamp 对象。

java.sql.Timestamp timestamp = java.sql.Timestamp.valueOf("1800-01-01 00:00:00.0");
System.out.println(timestamp);

Timestamp ctimestamp = new Timestamp(System.currentTimeMillis());
System.out.println(ctimestamp);
System.out.println(ctimestamp.getYear() - timestamp.getYear());

输出:

1800-01-01 00:00:00.0
2017-11-13 11:42:44.56
217

它可以工作并给出适当的 217 值。这里的问题是 getYear() 已弃用。

有没有其他方法可以获得它,这样我就不会收到任何弃用警告?

【问题讨论】:

  • 您是否尝试过使用日历类或本地日期?
  • @dan6657,第一个时间戳来自数据库。因此,上述 sn-p 仅用于测试目的。我必须创建一个新的当前时间戳才能获得差异
  • 你检查了吗:Period and duration
  • 为什么? Timestamp 基本上是 ODBC 的 POJO。 (实际上是java.util.Date 的一个包装器。但是您应该将其转换为java.time.* 实例以使用新的时间API。您可以使用toLocalDateTime(没有时间写完整的答案...)跨度>
  • @Yakhoob 较新的 JDBC 驱动程序 (JDBC 4.2) 或其他从数据库获取数据的较新方法将很乐意将数据库中的时间戳作为 Instant 提供给您。这是你应该想要的。您没有理由坚持使用早已过时的类型。

标签: java timestamp


【解决方案1】:

API java.time

我们可以使用Timestamp.toLocalDateTime() 轻松地将java.sql.Timestamp 转换为LocalDateTime

LocalDateTime 中,我们可以使用LocalDateTime.toLocalDate() 提取LocalDate

现在我们有了LocalDate,我们可以使用Period。 Oracle 上有完整的解释:Period and Duration

java.sql.Timestamp timestamp = java.sql.Timestamp.valueOf("1800-01-01 00:00:00.0");
java.time.LocalDate lDate = timestamp.toLocalDateTime().toLocalDate();

java.time.Period prd = java.time.Period.between(lDate, java.time.LocalDate.now());

System.out.println("Years : " + prd.getYears());
System.out.println("Month : " + prd.getMonths());
System.out.println("Days : " + prd.getDays());

今天日期(2017 年 11 月 13 日)

Years : 217
Month : 10
Days : 12

正如Ole V.V所建议的,如果你只需要一个特定的字段,你可以使用ChronoUnit like:

java.time.temporal.ChronoUnit.YEARS.between(
        timestamp.toLocalDateTime(), 
        java.time.LocalDateTime.now()
)

注意:我在这里为我的课程使用了绝对路径,如果这令人震惊,请告诉我,我会清理它以使其更具可读性。

【讨论】:

  • 对此表示赞赏。
  • 赞成java.time 的良好推荐。如果 OP 只对年(而不是月)感兴趣,则使用 ChronoUnit.YEARS.between(Timestamp.valueOf("1800-01-01 00:00:00.0").toLocalDateTime(), LocalDateTime.now()) 可能更简单。甚至更好地将数据库中的数据检索到现代类的实例中(LocalDateTimeInstant)并完全放弃使用过时的 Timestamp 类。
  • @OleV.V.感谢您的反馈意见。我确实包含了一个比必要的更完整的示例,我也包含了带有ChronoUnit 的较短示例。对于第二部分(根本不要使用Timestamp),我宁愿不从那条路开始,我还没有机会检查支持的内容,所以我不确定到底什么是可能的。跨度>
【解决方案2】:

使用Calendarclass:

    Timestamp timestamp = Timestamp.valueOf("1800-01-01 00:00:00.0");

    Timestamp ctimestamp = new Timestamp(System.currentTimeMillis());
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(timestamp);

    int firstYearValue = calendar.get(Calendar.YEAR);

    calendar.setTime(ctimestamp);
    int secondYearValue = calendar.get(Calendar.YEAR);

    int diff = secondYearValue - firstYearValue;
    System.out.println(diff);

【讨论】:

  • 老实说,我们今天不应该使用Calendar作为默认选择...检查java.time
  • 我同意@AxelH,在很多情况下我使用joda time,但这里的目的不是深入研究java日期时间问题,而是解决一个即时案例,我很感激
  • java.time 是自 JAVA 8 以来 JDK 的一部分。这不是 Joda API。所以这是一个开箱即用的解决方案(有关使用的小例子,请参阅我的答案)。
  • 顺便说一句,您应该首先从Calendar.getInstance() 实例中获取secondYearValue,因为这会返回当前时间的Calendar。不需要使用Timestamp 的第二个实例,也不需要使用setTime 两次。
  • 是的,你是对的,但我想一般情况下第二个值不会被强制为当前日期,我的意思是当年
猜你喜欢
  • 2016-12-17
  • 1970-01-01
  • 2017-03-26
  • 2011-04-26
  • 2018-05-29
  • 1970-01-01
  • 2011-09-04
  • 2021-07-31
  • 2014-05-22
相关资源
最近更新 更多