无论日期如何,检查给定时间是否介于两次之间

My *_*God 41 java android calendar timespan date

我有时间跨度:

String time1 = 01:00:00

String time2 = 05:00:00

我想检查time1time2是否介于两者之间20:11:13 and 14:49:00.

实际上,01:00:00大于20:11:13和小于14:49:00考虑20:11:13总是小于14:49:00.这是先决条件.

所以我想要的是,20:11:13 < 01:00:00 < 14:49:00.

所以我需要这样的东西:

 public void getTimeSpans()
{
    boolean firstTime = false, secondTime = false;

    if(time1 > "20:11:13" && time1 < "14:49:00")
    {
       firstTime = true;
    }

    if(time2 > "20:11:13" && time2 < "14:49:00")
    {
       secondTime = true;
    }
 }
Run Code Online (Sandbox Code Playgroud)

我知道这个代码没有给出正确的结果,因为我正在比较字符串对象.

怎么做,因为他们是时间跨度而不是比较的字符串?

Kon*_*kov 46

您可以使用Calendar该类进行检查.

例如:

try {
    String string1 = "20:11:13";
    Date time1 = new SimpleDateFormat("HH:mm:ss").parse(string1);
    Calendar calendar1 = Calendar.getInstance();
    calendar1.setTime(time1);
    calendar1.add(Calendar.DATE, 1);


    String string2 = "14:49:00";
    Date time2 = new SimpleDateFormat("HH:mm:ss").parse(string2);
    Calendar calendar2 = Calendar.getInstance();
    calendar2.setTime(time2);
    calendar2.add(Calendar.DATE, 1);

    String someRandomTime = "01:00:00";
    Date d = new SimpleDateFormat("HH:mm:ss").parse(someRandomTime);
    Calendar calendar3 = Calendar.getInstance();
    calendar3.setTime(d);
    calendar3.add(Calendar.DATE, 1);

    Date x = calendar3.getTime();
    if (x.after(calendar1.getTime()) && x.before(calendar2.getTime())) {
        //checkes whether the current time is between 14:49:00 and 20:11:13.
        System.out.println(true);
    }
} catch (ParseException e) {
    e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)

  • 如果someRandomTime位于string1和"00:00:00"之间,这可能会给出错误的答案.如果我错了,请纠正我. (3认同)
  • 然后,您将不得不在某个地方标记那些时间不是同一天! (2认同)
  • 它的显示11:44在19:28到23:59之间...任何解决方案. (2认同)

Bas*_*que 26

TL;博士

20:11:13 <01:00:00 <14:49:00

LocalTime target = LocalTime.parse( "01:00:00" ) ;
Boolean targetInZone = ( 
    target.isAfter( LocalTime.parse( "20:11:13" ) ) 
    && 
    target.isBefore( LocalTime.parse( "14:49:00" ) ) 
) ; 
Run Code Online (Sandbox Code Playgroud)

java.time.LocalTime

java.time类包括LocalTime仅表示没有日期且没有时区的时间.

所以我想要的是,20:11:13 <01:00:00 <14:49:00.

首先,我们定义边界.您的输入字符串恰好符合标准ISO 8601格式.默认情况下,java.time类使用ISO 8601格式,因此无需指定格式设置模式.

LocalTime start = LocalTime.parse( "20:11:13" );
LocalTime stop = LocalTime.parse( "14:49:00" );
Run Code Online (Sandbox Code Playgroud)

并定义我们的测试用例,即目标01:00:00.

LocalTime target = LocalTime.parse( "01:00:00" );
Run Code Online (Sandbox Code Playgroud)

现在我们设置比较这些LocalTime对象.我们想看看目标是在较晚时间之后但在较早时间之前.这意味着在这种情况下半夜,第二天早上大约晚上8点到凌晨3点之间.

Boolean isTargetAfterStartAndBeforeStop = ( target.isAfter( start ) && target.isBefore( stop ) ) ;
Run Code Online (Sandbox Code Playgroud)

该测试可以更简单地说" 不在凌晨3点到晚上8点之间".然后,我们可以推广到任何一对LocalTime对象,我们在这两个对象之间进行测试,如果开始是在24小时制停止之前,而不是在停止之后是否开始(如本问题的情况).

此外,时间跨度通常采用半开放式方法处理,其中开头是包含在内的,而结尾是独占的.因此,严格地说,"之间"比较将是"目标等于或晚于开始并且目标在停止之前",或者更简单地说,"目标不是在开始之前和停止之前".

Boolean isBetweenStartAndStopStrictlySpeaking = 
    ( ( ! target.isBefore( start ) && target.isBefore( stop ) ) ;
Run Code Online (Sandbox Code Playgroud)

如果开始是在停止之后,在24小时内,则假设我们想要问题中建议的逻辑(在晚上8点之后但在凌晨3点之前).

if( start.isAfter( stop ) ) {
    return ! isBetweenStartAndStopStrictlySpeaking ;
} else {
    return isBetweenStartAndStopStrictlySpeaking ;
}
Run Code Online (Sandbox Code Playgroud)

关于java.time

java.time框架是建立在Java 8和更高版本.这些类取代麻烦的老传统日期时间类,如java.util.Date,Calendar,和SimpleDateFormat.

现在处于维护模式Joda-Time项目建议迁移到java.time类.

要了解更多信息,请参阅Oracle教程.并搜索Stack Overflow以获取许多示例和解释.规范是JSR 310.

您可以直接与数据库交换java.time对象.使用符合JDBC 4.2或更高版本的JDBC驱动程序.不需要字符串,不需要课程.java.sql.*

从哪里获取java.time类?

ThreeTen-额外项目与其他类扩展java.time.该项目是未来可能添加到java.time的试验场.您可以在此比如找到一些有用的类Interval,YearWeek,YearQuarter,和更多.


Sur*_*ali 18

@kocko给出的答案仅在同一天起作用.
如果开始时间"23:00:00"并且结束"02:00:00" [第二天]并且当前时间是"01:30:00"那么结果将是假的...
我修改了@ kocko的答案以完美地工作

public static boolean isTimeBetweenTwoTime(String initialTime, String finalTime, 
    String currentTime) throws ParseException {

    String reg = "^([0-1][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$";
    if (initialTime.matches(reg) && finalTime.matches(reg) && 
        currentTime.matches(reg)) 
    {
        boolean valid = false;
        //Start Time
        //all times are from java.util.Date
        Date inTime = new SimpleDateFormat("HH:mm:ss").parse(initialTime);
        Calendar calendar1 = Calendar.getInstance();
        calendar1.setTime(inTime);

        //Current Time
        Date checkTime = new SimpleDateFormat("HH:mm:ss").parse(currentTime);
        Calendar calendar3 = Calendar.getInstance();
        calendar3.setTime(checkTime);

        //End Time
        Date finTime = new SimpleDateFormat("HH:mm:ss").parse(finalTime);
        Calendar calendar2 = Calendar.getInstance();
        calendar2.setTime(finTime);

        if (finalTime.compareTo(initialTime) < 0) 
        {
            calendar2.add(Calendar.DATE, 1);
            calendar3.add(Calendar.DATE, 1);
        }

        java.util.Date actualTime = calendar3.getTime();
        if ((actualTime.after(calendar1.getTime()) || 
             actualTime.compareTo(calendar1.getTime()) == 0) && 
             actualTime.before(calendar2.getTime())) 
        {
            valid = true;
            return valid;
        } else {
            throw new IllegalArgumentException("Not a valid time, expecting 
            HH:MM:SS format");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

产量

"07:00:00" - "17:30:00" - "15:30:00" [current] - true
"17:00:00" - "21:30:00" - "16:30:00" [current] - false
"23:00:00" - "04:00:00" - "02:00:00" [current] - true
"00:30:00" - "06:00:00" - "06:00:00" [current] - false 
Run Code Online (Sandbox Code Playgroud)

(我已将下限值包含在[上限值-1]中)

  • @SurendraJnawali 当然,请尝试这个 "23:00:00" - "06:00:00" - "23:40:00" [current] - false 。我还发布了一个答案来更新您的答案。当然,所有功劳都归于您。 (2认同)

Jit*_*Dev 16

修改了@Surendra Jnawali'代码.它失败

如果当前时间是23:40:00,即大于开始时间且小于等于23:59:59.

所有信用都归于真正的所有者

这应该是这样的:这很完美

public static boolean isTimeBetweenTwoTime(String argStartTime,
            String argEndTime, String argCurrentTime) throws ParseException {
        String reg = "^([0-1][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$";
        //
        if (argStartTime.matches(reg) && argEndTime.matches(reg)
                && argCurrentTime.matches(reg)) {
            boolean valid = false;
            // Start Time
            java.util.Date startTime = new SimpleDateFormat("HH:mm:ss")
                    .parse(argStartTime);
            Calendar startCalendar = Calendar.getInstance();
            startCalendar.setTime(startTime);

            // Current Time
            java.util.Date currentTime = new SimpleDateFormat("HH:mm:ss")
                    .parse(argCurrentTime);
            Calendar currentCalendar = Calendar.getInstance();
            currentCalendar.setTime(currentTime);

            // End Time
            java.util.Date endTime = new SimpleDateFormat("HH:mm:ss")
                    .parse(argEndTime);
            Calendar endCalendar = Calendar.getInstance();
            endCalendar.setTime(endTime);

            //
            if (currentTime.compareTo(endTime) < 0) {

                currentCalendar.add(Calendar.DATE, 1);
                currentTime = currentCalendar.getTime();

            }

            if (startTime.compareTo(endTime) < 0) {

                startCalendar.add(Calendar.DATE, 1);
                startTime = startCalendar.getTime();

            }
            //
            if (currentTime.before(startTime)) {

                System.out.println(" Time is Lesser ");

                valid = false;
            } else {

                if (currentTime.after(endTime)) {
                    endCalendar.add(Calendar.DATE, 1);
                    endTime = endCalendar.getTime();

                }

                System.out.println("Comparing , Start Time /n " + startTime);
                System.out.println("Comparing , End Time /n " + endTime);
                System.out
                        .println("Comparing , Current Time /n " + currentTime);

                if (currentTime.before(endTime)) {
                    System.out.println("RESULT, Time lies b/w");
                    valid = true;
                } else {
                    valid = false;
                    System.out.println("RESULT, Time does not lies b/w");
                }

            }
            return valid;

        } else {
            throw new IllegalArgumentException(
                    "Not a valid time, expecting HH:MM:SS format");
        }

    }
Run Code Online (Sandbox Code Playgroud)

结果

Comparing , Start Time /n    Thu Jan 01 23:00:00 IST 1970
Comparing , End Time /n      Fri Jan 02 02:00:00 IST 1970
Comparing , Current Time /n  Fri Jan 02 01:50:00 IST 1970
RESULT, Time lies b/w
Run Code Online (Sandbox Code Playgroud)


kal*_*lan 11

 Calendar now = Calendar.getInstance();

 int hour = now.get(Calendar.HOUR_OF_DAY); // Get hour in 24 hour format
 int minute = now.get(Calendar.MINUTE);

 Date date = parseDate(hour + ":" + minute);
 Date dateCompareOne = parseDate("08:00");
 Date dateCompareTwo = parseDate("20:00");

 if (dateCompareOne.before( date ) && dateCompareTwo.after(date)) {
    //your logic
 }

 private Date parseDate(String date) {

    final String inputFormat = "HH:mm";
    SimpleDateFormat inputParser = new SimpleDateFormat(inputFormat, Locale.US);
    try {
         return inputParser.parse(date);
    } catch (java.text.ParseException e) {
         return new Date(0);
    }
 }
Run Code Online (Sandbox Code Playgroud)

此外,更准确地说,如果比较当天00:00到24:00之间的时间间隔,您还需要解析当天.


Ale*_*amo 10

这里有很多答案,但我想提供一个新的答案,它与Basil Bourque 的答案相似,但有一个完整的代码示例。所以请看下面的方法:

private static void checkTime(String startTime, String endTime, String checkTime) {
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm:ss", Locale.US);
    LocalTime startLocalTime = LocalTime.parse(startTime, formatter);
    LocalTime endLocalTime = LocalTime.parse(endTime, formatter);
    LocalTime checkLocalTime = LocalTime.parse(checkTime, formatter);

    boolean isInBetween = false;
    if (endLocalTime.isAfter(startLocalTime)) {
      if (startLocalTime.isBefore(checkLocalTime) && endLocalTime.isAfter(checkLocalTime)) {
          isInBetween = true;
      }
    } else if (checkLocalTime.isAfter(startLocalTime) || checkLocalTime.isBefore(endLocalTime)) {
        isInBetween = true;
    }

    if (isInBetween) {
        System.out.println("Is in between!");
    } else {
        System.out.println("Is not in between!");
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您使用以下方法调用此方法:

checkTime("20:11:13", "14:49:00", "01:00:00");
Run Code Online (Sandbox Code Playgroud)

或使用:

checkTime("20:11:13", "14:49:00", "05:00:00");
Run Code Online (Sandbox Code Playgroud)

结果将是:

Is in between!
Run Code Online (Sandbox Code Playgroud)


ani*_*kar 5

以下方法检查“validateTime”是否在“startTime”和“endTime”之间,同时考虑“endTime”可能是第二天。要正确使用它,请以“HH:mm”共振峰解析您的日期。

 public static final boolean isBetweenValidTime(Date startTime, Date endTime, Date validateTime)
 {
        boolean validTimeFlag = false;

        if(endTime.compareTo(startTime) <= 0)
        {
            if(validateTime.compareTo(endTime) < 0 || validateTime.compareTo(startTime) >= 0)
            {
                 validTimeFlag = true;
            }
        }
        else if(validateTime.compareTo(endTime) < 0 && validateTime.compareTo(startTime) >= 0)
        {
             validTimeFlag = true;  
        }

        return validTimeFlag;
 }
Run Code Online (Sandbox Code Playgroud)