【问题标题】:How to check whether a time is between particular range?如何检查时间是否在特定范围之间?
【发布时间】:2016-10-23 12:12:13
【问题描述】:

我需要检查当前时间是否在上午 8 点到下午 3 点之间。如果在这些时间范围之间,那么我需要返回yes,否则返回false。

boolean isNowBetweenDateTime(final Date s, final Date e) {
    final Date now = new Date();
    return now.after(s) && now.before(e);
}

但我不确定我应该在这里使用Date 吗?我可以不使用时间戳并相应地检查时间戳吗?这样做的正确方法是什么?

我仍在使用 Java 7。

【问题讨论】:

  • 套用开始喝酒的借口,“它总是在世界某个地方的早上 8 点到下午 3 点之间”。一方面,您需要指定一个时区来评估本地时间。
  • 我不知道有一种“正确”的方法可以做到这一点。 java.util.Date 可以正常工作,但您可能需要查看 java.time.ZonedDateTime,这将有助于解决@AndyTurner 指出的时区问题
  • @AndyTurner 时区将是 PDT
  • @user1950349 全年无休?或者你的意思是例如美国/洛杉矶?无论您的回复如何,都知道 Date 没有时区信息,因此您可能不会总是得到您期望的结果。

标签: java date timestamp


【解决方案1】:

如果您使用的是 Java 8 之前的 Java 版本,请查看Joda 的 API 文档。

具体来说,有一个AbstractInterval#containsNow() 方法可以让你做你想做的事。

例如:

new Interval(start, end).containsNow();

其中 start 和 end 可以是许多不同的值/对象中的任何一个。请参阅可用的不同构造函数的文档:Interval


你可以修改你的方法如下:

boolean isNowBetweenDateTime(final DateTime s, final DateTime e) {
    return new Interval(s, e).containsNow();
}

也就是说,它只有一行,所以你真的不需要用你自己的方法来包装它:)

再次查看文档。 Interval 构造函数可以采用各种对象/值,因此请选择适合您需要的。我推荐 DateTime,因为它似乎最能描述你想要做什么。

【讨论】:

  • Java 8 发布两年后,第一个调用端口应该是 Java 8 时间 API。
  • @AndyTurner 我们中的一些人仍然需要使用旧版本的 Java :) 但公平地说,我已经编辑了我的答案。
  • 我还在使用 java 7。抱歉忘了在问题中提及。你能提供一个java 7的例子吗?
  • @user1950349 编辑了一个更完整的例子。
  • @avojak 哦,我现在明白了。我认为 Interval 是 Java 8,这就是我这么说的原因。你能告诉我如何将s 初始化为上午 8 点,将e 初始化为下午 3 点吗?我从来没有用过 Joda 这么糊涂。
【解决方案2】:

使用当前时间的日期很好。有几种方法可以解决。

1. System.currentTimeInMillis()

2. Date today = new Date()

【讨论】:

  • 这不能回答 OP 的问题。他不需要打印日期。
【解决方案3】:

Joda Time 是一个非常简单易用的库,如果您将比较日期对象定义为 LocalDate,那么您可以使用 isBefore()、isAfter( ) 布尔方法:https://docs.oracle.com/javase/8/docs/api/java/time/LocalDateTime.html#isBefore-java.time.chrono.ChronoLocalDateTime- 希望对您有所帮助!

【讨论】:

    【解决方案4】:

    java.time

    您正在使用旧的过时类。它们已被 Java 8 及更高版本中内置的 java.time 类所取代。见Oracle Tutorial。大部分功能已在 ThreeTen-Backport 中向后移植到 Java 6 和 7,并在 ThreeTenABP 中进一步适应 Android。

    LocalTime

    LocalTime 类实际上只代表一天中的时间值,这与旧的 java.sql.Timejava.util.Date 类不同。

    LocalTime start = LocalTime.of( 8 , 0 );
    LocalTime stop = LocalTime.of( 15 , 0 );
    

    时区

    确定当前时间需要时区。对于任何给定的时刻,时间在全球范围内因时区而异。

    ZoneId zoneId = ZoneId.of( "America/Montreal" );
    LocalTime now = LocalTime.now( zoneId );
    

    比较

    通过调用equals、isAfter 或 isBefore 进行比较。我们在这里使用半开方法,这在日期时间工作中很常见,其中开头是 inclusive 而结尾是 exclusive

     Boolean isNowInRange = ( ! now.isBefore( start ) ) && now.isBefore( stop ) ;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-07
      • 1970-01-01
      • 2020-07-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多