【问题标题】:Adding java time objects添加java时间对象
【发布时间】:2009-07-22 21:20:10
【问题描述】:

怎么说,在 calendar.getTime 的给定结果上加 1 小时?

【问题讨论】:

  • 试图弄清楚为什么这被否决了......
  • 可能是因为它是一个单一的班轮......不过,这并不是一个复杂的问题。刚接触java。哦,有些人确实很烂,我想可能就是这样。
  • 实际上,当您进入 DST 更改时,这是一个非常复杂的问题。例如,您是否总是期望 01:30 + 1 小时为 02:30?
  • +1 撤消反对票。 Stack Overflow 应该是一个人们可以提出合理问题的地方,而不是让他们觉得自己很愚蠢。我不认为对简单的问题投反对票或用“你试过用谷歌搜索答案吗?”来回答它们。在 SO 上一定是合适的。
  • @jim:对于这种事情,我根本不会使用日历。只需在任何地方使用 UTC 时间 - 大多数时候您甚至不需要使用人类可读的格式,只需使用自纪元以来的毫秒数。然后你可以添加你想要的毫秒数。仅当您需要将其显示给某人时将其格式化为人类可读的形式。

标签: java datetime time


【解决方案1】:

好吧,您可以将 1000 * 60 * 60 添加到 Date 的毫秒值。如果您不想改变 Calendar 实例本身,这可能是最简单的方法。 (顺便说一句,我不想​​确切地猜测Calendar 会在 DST 变化时做什么。如果你明白我的意思,它可能不会增加一个小时的 UTC 时间。)

因此,如果您确实想采用 Date 方法:

date.setTime(date.getTime() + 1000 * 60 * 60);

这将总是添加一个实际小时,而不管时区如何,因为 Date 实例没有时区 - 它只是自 1 月 1 日午夜以来大约几毫秒的包装1970 年 1 月 1 日。

但是,我强烈建议您使用 Joda Time 代替(就像我对 Java 日期/时间问题所做的那样)。它使这个和无数其他任务变得很多更容易和更可靠。我知道我在这方面听起来像是一个破纪录,但事实上它迫使你考虑你是否实际上在谈论当地的日期/时间,只是一个日期,一个当地的午夜等等都有很大的不同。

【讨论】:

  • DST 的 +1 - 非常容易错过,当它在 4 个月后在生产中爆炸时几乎不可能重现和修复。顺便说一句,这是我今天看到的第二个问题,乔恩的答案不是最重要的。我们所知道的世界是否即将结束? :-)
  • 与您的回答一样深入和有帮助,富人需要一些新手的爱,他的回答确实正是我所需要的。我应该从 javadocs 中获取但错过的东西:)
【解决方案2】:
Calendar cal = Calendar.getInstance();
//cal.setTime(date); //if you need to pass in a date
cal.add(Calendar.HOUR, 1);

【讨论】:

    【解决方案3】:

    tl;博士

    Instant.now().plusHours( 1 )
    

    ……或者……

    ZonedDateTime.now( ZoneId.of( "America/Montreal"  ).plusHours( 1 ) 
    

    使用 java.time

    接受的答案是正确的,但已过时。

    麻烦的旧旧日期时间类已被 java.time 类所取代。

    请使用ZonedDateTime,而不是Calendar

    ZoneId z = ZoneId.of( "America/Montreal" );
    ZonedDateTime zdt = ZonedDateTime.now( z );
    ZonedDateTime zdtOneHourLater = zdt.plusHours( 1 );
    

    请注意,wall-clock time 可能不会晚于一个小时。诸如 Daylight Saving Time (DST) 之类的异常意味着一个小时后可能会出现 两个 小时后,从凌晨 1 点跳到凌晨 3 点以进行 DST 切换。

    要从旧的 Calendar 转换为现代 java.time 类型,请参阅 this Question

    您的大部分工作都应该使用 UTC。为此,请使用 Instant 类。

    Instant hourLater = Instant.now().plusHours( 1 );
    

    关于java.time

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

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

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

    大部分 java.time 功能在ThreeTen-Backport 中向后移植到Java 6 和7,并进一步适应ThreeTenABP 中的Android(参见How to use…)。

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

    【讨论】:

      猜你喜欢
      • 2019-12-27
      • 2016-10-24
      • 1970-01-01
      • 1970-01-01
      • 2011-12-23
      • 2021-04-06
      • 2012-08-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多