检查一个给定的时间是否在两次之间,不pipedate

我有时间盘:

stringtime1 = 01:00:00

stringtime2 = 05:00:00

我想检查time1time2是否在20:11:13 and 14:49:00之间。

实际上,01: 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; } } 

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

如何做到这一点,因为他们是时间跨度,但不是比较的string?

Solutions Collecting From Web of "检查一个给定的时间是否在两次之间,不pipedate"

您可以使用Calendar类来检查。

例如:

 try { String string1 = "20:11:13"; Date time1 = new SimpleDateFormat("HH:mm:ss").parse(string1); Calendar calendar1 = Calendar.getInstance(); calendar1.setTime(time1); 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(); } 

@ kocko给出的答案仅在同一天工作。
如果开始时间为“23:00:00” ,结束时间为“02:00:00” ,当前时间为“01:30:00”,则结果为false。
我修改了@ 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 java.util.Date inTime = new SimpleDateFormat("HH:mm:ss").parse(initialTime); Calendar calendar1 = Calendar.getInstance(); calendar1.setTime(inTime); //Current Time java.util.Date checkTime = new SimpleDateFormat("HH:mm:ss").parse(currentTime); Calendar calendar3 = Calendar.getInstance(); calendar3.setTime(checkTime); //End Time java.util.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"); } } 

产量

 "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 

(我已经包含下限值到[上限值-1])

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" ) ) ) ; 

java.time.LocalTime

java.time类包括LocalTime来表示只有没有date和没有时区的时间。

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

首先我们定义边界。 您的inputstring恰好符合标准ISO 8601格式。 java.time类默认使用ISO 8601格式,所以不需要指定格式化模式。

 LocalTime start = LocalTime.parse( "20:11:13" ); LocalTime stop = LocalTime.parse( "14:49:00" ); 

并定义我们的testing用例,目标01:00:00

 LocalTime target = LocalTime.parse( "01:00:00" ); 

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

 Boolean isTargetAfterStartAndBeforeStop = ( target.isAfter( start ) && target.isBefore( stop ) ) ; 

这个testing可以更简单地表述为“ 不在上午3点到下午8点之间”。 然后,我们可以推广到任何一对LocalTime对象,如果开始在24小时制停止之前进行testing,而不是在停止之后开始(如本问题的情况下)那样。

此外,时间跨度通常以半开放方式处理,其中开始包含,而结束是排他性的 。 所以严格来说,比较“严格来说就是目标等于或者晚于开始,目标在停止之前”,或者更简单地说,“目标不在开始之前和停止之前”。

 Boolean isBetweenStartAndStopStrictlySpeaking = ( ( ! target.isBefore( start ) && target.isBefore( stop ) ) ; 

如果开始是在24小时制之后停止,那么假设我们需要问题中提出的逻辑(晚上8点之后,凌晨3点之前)。

 if( start.isAfter( stop ) ) { return ! isBetweenStartAndStopStrictlySpeaking ; } else { return isBetweenStartAndStopStrictlySpeaking ; } 

关于java.time

java.time框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧的遗留date时间类,如java.util.DateCalendarSimpleDateFormat

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

要了解更多信息,请参阅Oracle教程 。 并search堆栈溢出了很多例子和解释。 规范是JSR 310 。

从何处获取java.time类?

  • Java SE 8SE 9及更高版本
    • 内置。
    • 带有捆绑实现的标准Java API的一部分。
    • Java 9增加了一些小function和修复。
  • Java SE 6SE 7
    • 大部分的java.timefunction都被移植到了ThreeTen-Backport中的 Java 6&7中。
  • Android的
    • ThreeTenABP项目专门针对Android,采用了ThreeTen-Backport (上文提到)。
    • 请参阅如何使用ThreeTenABP …。

ThreeTen-Extra项目将java.time扩展到其他类。 这个项目是未来可能增加java.time的一个试验场。 你可能会在这里find一些有用的类,比如IntervalYearWeekYearQuarter 等等 。

修改@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"); } } 

结果

 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 
  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); } } 

此外,更准确地说,如果比较当天00:00到24:00之间的时间间隔,则还需要parsing当天。

下面的方法检查'validateTime'是否在'startTime'和'endTime'之间,而不考虑'endTime'可能是第二天的可能性。 要正确使用它,请在“HH:mm”共振峰中分析您的date。

  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; } 

与@kocko的帮助一样,完整的工作代码如下:

 try{ Date time11 = new SimpleDateFormat("HH:mm:ss").parse("20:11:13"); Calendar calendar1 = Calendar.getInstance(); calendar1.setTime(time11); Date time22 = new SimpleDateFormat("HH:mm:ss").parse("14:49:00"); Calendar calendar2 = Calendar.getInstance(); calendar2.setTime(time22); Date currentTime = new SimpleDateFormat("HH:mm:ss").parse("00:00:00"); Calendar startingCalendar = Calendar.getInstance(); startingCalendar.setTime(currentTime); startingCalendar.add(Calendar.DATE, 1); //let's say we have to check about 01:00:00 String someRandomTime = time1; Date d = new SimpleDateFormat("HH:mm:ss").parse(someRandomTime); Calendar calendar3 = Calendar.getInstance(); calendar3.setTime(d); if(startingCalendar.getTime().after(calendar1.getTime())) { calendar2.add(Calendar.DATE, 1); calendar3.add(Calendar.DATE, 1); } Date x = calendar3.getTime(); if (x.after(calendar1.getTime()) && x.before(calendar2.getTime())) { System.out.println("Time is in between.."); } else { System.out.println("Time is not in between.."); } } catch (ParseException e) { e.printStackTrace(); } 

抱歉sudo代码..我正在打电话。 ;)

between(time <string2 && time> string1); if(string1> string2)介于=!之间;

如果他们是时间戳或string这个工作。 只需更改variables名称即可

从$ time,$ to和$ fromstring剥离冒号,转换为int,然后使用以下条件检查时间是否在from和to之间。 例子是在PHP中,但不应该。

 if(($to < $from && ($time >= $from || $time <= $to)) || ($time >= $from && $time <= $to)) { return true; } 

实际工作function如下

 public static boolean isTimeBetweenTwoTime(Date startTime, Date stopTime, Date currentTime) { //Start Time Calendar StartTime = Calendar.getInstance(); StartTime.setTime(startTime); //Current Time Calendar CurrentTime = Calendar.getInstance(); CurrentTime.setTime(currentTime); //Stop Time Calendar StopTime = Calendar.getInstance(); StopTime.setTime(stopTime); if (stopTime.compareTo(startTime) < 0) { if (CurrentTime.compareTo(StopTime) < 0) { CurrentTime.add(Calendar.DATE, 1); } StopTime.add(Calendar.DATE, 1); } return CurrentTime.compareTo(StartTime) >= 0 && CurrentTime.compareTo(StopTime) < 0; } 

在你的情况下,开始时间(20:11:13)大于结束时间(14:49:00)。 这是一个合理的假设,您可以通过在结束时间添加一天或从开始时间减去一天来解决问题。 如果你这样做,你会被困,因为你不知道在哪一天的testing时间。

您可以通过检查您的testing时间是否在结束时间和开始时间之间来避免此陷阱。 如果属实,则结果是“不在中间”; 其他结果是“在两者之间”。

这里是我一直使用的JAVAfunction。 它对我来说工作至今。 祝你好运。

 boolean IsTimeInBetween(Calendar startC, Calendar endC, Calendar testC){ // assume year, month and day of month are all equal. startC.set(1,1,1); endC.set(1,1,1); testC.set(1,1,1); if (endC.compareTo(startC) > 0) { if ((testC.compareTo(startC)>=0) && (testC.compareTo(endC)<=0)) { return true; }else { return false; } }else if (endC.compareTo(startC) < 0) { if ((testC.compareTo(endC) >= 0) && (testC.compareTo(startC) <= 0)) { return false; } else { return true; } } else{ // when endC.compareTo(startC)==0, I return a ture value. Change it if you have different application. return true; } } 

要创build一个日历实例,你可以使用:

 Calendar startC = Calendar.getInstance(); startC.set(Calendar.HOUR_OF_DAY, 20); startC.set(Calendar.MINUTE,11); startC.set(Calendar.SECOND,13); 

听起来你的问题是OR情况…你想检查time1> 20:11:13或time1 <14:49:00。

20:11:13从来没有超过你的范围(14:49:00),反之亦然。 想想看,如果你正在检查一个时间不在一个正确排列的几个时间戳之间。

Java 8 – LocalDateTime

那这个呢?

 final LocalDateTime now = LocalDateTime.now(); final LocalDateTime minRange = LocalDateTime.of(now.getYear(), now.getMonth(), now.getDayOfMonth(), 22, 30); //Today, 10:30pm LocalDateTime maxRange = LocalDateTime.of(now.getYear(), now.getMonth(), now.getDayOfMonth(), 6, 30); //Tomorrow, 6:30am maxRange = maxRange.plusDays(1); //Ensures that you don't run into an exception if minRange is the last day in the month. if (now.isAfter(minRange) && now.isBefore(maxRange)) { //Action } 

使用LocalTime将简单地忽略Date值:

 public class TimeIntervalChecker { static final LocalTime time1 = LocalTime.parse( "20:11:13" ) ; static final LocalTime time2 = LocalTime.parse( "14:49:00" ) ; public static void main(String[] args) throws java.lang.Exception { LocalTime nowUtcTime = LocalTime.now(Clock.systemUTC()); if (nowUtcTime.isAfter(time1) && nowUtcTime.isBefore(time2)){ System.out.println(nowUtcTime+" is after: "+ time1+" and before: "+ time2); } } 

读了几个回复之后,我觉得写得太复杂了。 试试我的代码

 public static boolean compare(String system_time, String currentTime, String endtimes) { try { SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm:ss"); Date startime = simpleDateFormat.parse("19:25:00"); Date endtime = simpleDateFormat.parse("20:30:00"); //current time Date current_time = simpleDateFormat.parse("20:00:00"); if (current_time.after(startime) && current_time.before(endtime)) { System.out.println("Yes"); return true; } else { System.out.println("No"); return false; } } catch (ParseException e) { e.printStackTrace(); } return false; } 

在下面的代码snipet中,正在validation的是,如果当前时间(可以是任何)存在于开始和结束时间之间:

  Calendar startTimeCal = Calendar.getInstance(); startTimeCal.setTime(startTime); int startTimeHour = startTimeCal.get(Calendar.HOUR_OF_DAY); if (startTimeHour == 0){ startTimeHour = 24; } int startTimeMinutes = startTimeCal.get(Calendar.MINUTE); Calendar curTimeCal = Calendar.getInstance(); curTimeCal.setTime(currentTime); int curTimeHour = curTimeCal.get(Calendar.HOUR_OF_DAY); int curTimeMinutes = curTimeCal.get(Calendar.MINUTE); Calendar endTimeCal = Calendar.getInstance(); endTimeCal.setTime(endTime); int endTimeHour = endTimeCal.get(Calendar.HOUR_OF_DAY); if (endTimeHour == 0) { endTimeHour = 24; } int endTimeMinutes = endTimeCal.get(Calendar.MINUTE); if (((curTimeHour > startTimeHour) || (curTimeHour == startTimeHour && curTimeMinutes >= startTimeMinutes)) && ((curTimeHour < endTimeHour) || (curTimeHour == endTimeHour && curTimeMinutes <= endTimeHour))) { //time exists between start and end time } else { //time doesn't exist between start and end time }