【问题标题】:How to check if we are between 2 datetime objects right now? [duplicate]如何检查我们现在是否在 2 个日期时间对象之间? [复制]
【发布时间】:2019-04-11 17:40:03
【问题描述】:

我有一个对象,其成员具有开始日期时间和结束日期时间

class MyObject {  
   DateTime start;  
   DateTime end;  

   public MyObject(String isoUtcStart, String isoUtcEnd) {
      this.start = new DateTime(isoUtcStart);  
      this.end = new DateTime(isoUtcEnd);  
   }  
} 

我想要确定我们现在是否在这些时刻的范围内。
我这样做如下:

public boolean isWithinCurrentTime(MyObject o) {  
     DateTime now = DateTime.now(DateTimeZone.UTC);
     return (o.getStart().isBefore(now) || o.getStart().isEqual(now))
                    && (o.getEnd().isAfter(now) || o.getEnd().isEqual(now));  
}  

不过,这似乎有点矫枉过正。有没有更好的办法?我的意思是:

  1. 有没有类似isBeforeOrEqual 的东西?找不到这样的方法
  2. o.getStart().isBeforeNow()有区别吗?不确定这是否相同,即 UTC 比较
  3. 转移到 long 比较 (getmillis) 是一种更明智的方法吗?

【问题讨论】:

  • 我不认为 isEqual() 是必要的。使用datetime 对象的分辨率,这些情况几乎永远不会发生。仅当您将当前时间限制为一天中的某个时间时,您才需要这样做。
  • @Steve: 可能我错过了你的意思,但由于start 包含小时和分钟,排除now 的时间和分钟完全相同的可能性不是错误的?
  • 它包含的不止这些。它至少下降到毫秒。
  • 这个问题作为另一个问题被关闭,但在另一个问题中没有解释是否使用 UTC
  • 几乎相反。 LocalDateTime 没有任何时区,因此没有在时间线上定义一个点。 DateTime 有一个 UTC 偏移量(不是时区)并且确实定义了一个时间点。

标签: java jodatime utc


【解决方案1】:

使用 joda 的 Interval 类来表示 [start;end) 时间间隔。然后检查这个时间间隔是否包含指定的瞬间。

Interval interval = new Interval(o.getStart(), o.getEnd());
interval.contains(DateTime.now(DateTimeZone.UTC))

或者您可以尝试使用 interval.containsNow() 而不显式传递 now

【讨论】:

  • containsNow 使用UTC?
  • 你不需要关心,@Jim。 DateTime,无论是否采用 UTC,都唯一地定义了一个时间点,并且 Joda-Time 可以独立于时区偏移正确地确定哪个在另一个之前或之后。
  • @OleV.V.:当您说uniquely defines a point in time 时,这意味着所有DateTime 点通用的时间尺度/时间线。如果不是 UTC,这个时间尺度/时间线是什么?
  • 我不知道,我们也不需要关心。我的猜测是它自纪元以来以毫秒为单位实现。 @吉姆
  • 是的,containsNow 实际上是对contains 的调用,但以DateTimeUtils.currentTimeMillis() 作为参数。
【解决方案2】:

有。

导入日期类 java.util.Date

利用这些方法

date1.after( date2 ) - 如果 date1 在 date2 之后,则返回 true;否则为假。

date1.before( date2 ) - 如果 date1 在 date2 之前返回 true;否则为假。

date1.compareTo(date2)

【讨论】:

  • 感谢您的贡献。 JodaTime 被问及并提供了比Date 更优雅的解决方案。我不鼓励使用这个答案。
猜你喜欢
  • 2011-02-07
  • 2013-11-08
  • 2013-03-01
  • 1970-01-01
  • 2021-12-18
  • 1970-01-01
  • 1970-01-01
  • 2018-01-31
  • 1970-01-01
相关资源
最近更新 更多