在Java中,如何检查时间是否在两个Date对象中

时间:2012-05-02 10:25:42

标签: java android date

我正在尝试在Java中创建一个方法,如果当前时间介于设置的时间间隔(startTime和endTime)之间,则返回true。

日期无关紧要。这样做的最佳方式是什么?

这是我的尝试,它不起作用:

public boolean isNowBetweenDateTime()
{
    final Date now = new Date();
    return now.after(startTime) && now.before(endTime);
}

检查时间是否在两个Date对象中,忽略年,月的最佳方式(在java中)是什么?

5 个答案:

答案 0 :(得分:3)

您的代码看起来不错。只需将nowstartTimeendTime的日期设置为某个硬编码值。

答案 1 :(得分:1)

TL;博士

Interval.of( start.toInstant() , stop.toInstant() ).contains( Instant.now() )

半开

在日期时间处理中,半开放式方法通常用于定义时间跨度。开头是包含,而结尾是独占。因此,一周定义为从星期一的第一个时刻开始,直到但不包括,即下一个星期一的第一个时刻。我们有时会直观地使用这种半开放式方法,午餐时间为12比1意味着从中午开始,但在时钟到达下午1点之前回到你的工作或班级。在整个日期工作中始终如一地使用半开放式将使逻辑和编程更清晰,更清晰,更简单。

所以你的逻辑应该是,“现在不是开始之前现在结束之前”。请注意,“不在之前”是一种紧凑的说法“等于OR就在之后”。

boolean isNowBetweenDateTime = ( ! now.before(startTime) ) && now.before(endTime) ; // Not before start AND is before stop.

ZonedDateTime

问题和其他答案使用现在由java.time类取代的麻烦的旧遗留日期时间类。

ZonedDateTime类表示时间轴上具有指定时区的时刻。

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime now = ZonedDateTime.now( z );
ZonedDateTime start = now.minusWeeks( 1 );  // Simulating input.
ZonedDateTime stop = now.plusWeeks( 2 );  // Simulating input.

你可以自己编写逻辑来测试现在是否介于。

之间
Boolean isBetween = ( ! now.isBefore( start ) ) && stop.isBefore( stop );

Interval

如果要做更多这类工作,请查看ThreeTen-Extra项目。该库使用其他功能扩展了java.time类。具体而言,Interval类将有所帮助,代表时间轴上的一对时刻。实现各种比较方法,例如containsenclosesabutsoverlaps

使用一对Instant对象实例化IntervalInstant代表UTC中时间轴上的一个时刻。我们可以从每个ZonedDateTime对象中提取Instant个对象。

Interval interval = Interval.of( start.toInstant() , stop.toInstant() );
Boolean isBetween = interval.contains( now.toInstant() );  // Or pass `Instant.now()`.

您还可以通过Instant.now()调用Instant获取当前时刻。

关于java.time

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

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

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。

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

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuarter等。

答案 2 :(得分:0)

首先,我建议使用Calendar而不是Date。我之前遇到过一些问题,使用日期。 我会用毫秒来比较日期,这是最安全的方法。代码似乎是这样的:

Date now = new Date();

long startTimeInMillis = startTime.getTime();
long endTimeInMillis = endTime.getTime();
return now.getTime >= startTimeInMillis && now.getTime < endTimeInMillis;

答案 3 :(得分:0)

如果您想忽略日期并且只考虑一天中的时间,请考虑使用Joda-Time的LocalTime,它专门用于保存时间部分。

以下是一个例子:

java.util.Date startTime = ... ;
java.util.Date endTime = ... ;

public boolean isNowBetweenDateTime()
{
    // get current time
    final LocalTime now = new LocalTime();

    // convert the java.util.Dates to LocalTimes and then compare
    return now.isAfter(LocalTime.fromDateFields(startTime)) &&
           now.isBefore(LocalTime.fromDateFields(endTime));
}

答案 4 :(得分:0)

如果当前时间介于两个其他时间之间,则此java函数返回true。它会忽略年/月/日。

import java.text.*;
import java.util.Date;

public static boolean isNowBetweenHours() throws ParseException
{
    String leftBoundaryHours = "01:00:00";   //01:00 hours, military time.(1AM)
    String rightBoundaryHours = "14:00:00";  //14:00 hours, military time.(2PM)

    //returns true if current time is between 
    //leftBoundaryHours and rightBoundaryHours.

    //This formatter converts a bare string to a date.
    DateFormat formatter = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss");

    //add the hand specified time to 1970-01-01 to create left/right boundaries.
    Date leftTimeBoundary = formatter.parse("1970-01-01 " + leftBoundaryHours);
    Date rightTimeBoundary = formatter.parse("1970-01-01 " + rightBoundaryHours);

    //extract only the hours, minutes and seconds from the current Date.
    DateFormat extract_time_formatter = new SimpleDateFormat("HH:mm:ss");

    //Get the current time, put that into a string, add the 1970-01-01, 
    Date now = formatter.parse("1970-01-01 " + 
        extract_time_formatter.format(new Date()));

    //So it is easy now, with the year, month and day forced as 1970-01-01
    //all you do is make sure now is after left, and now is before right.
    if (now.after(leftTimeBoundary) && now.before(rightTimeBoundary))
        return true;
    else
        return false;
}

调用如下函数:

try {
    System.out.println(isNowBetweenHours());
} catch (ParseException e) {

}

如果当前时间在01:00小时之后但在14:00 hours之前,则返回true。否则它返回false。