Check if a given time lies between two times regardless of date
我有时间跨度:
String time1 = 01:00:00
String time2 = 05:00:00
我想检查time1和time2是否都在
实际上,考虑到
所以我想要的是
所以我需要这样的东西:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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; } } |
我知道此代码在比较字符串对象时无法给出正确的结果。
如何处理时间跨度而不是要比较的字符串?
您可以使用
例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | 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(); } |
n
@kocko给出的答案仅在同一天有效。
如果开始时间为" 23:00:00",结束时间为" 02:00:00" [第二天],并且当前时间为" 01:30:00",则结果将为假...
我修改了@kocko的答案以使其正常工作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | 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"); } } } |
输出
1 2 3 4 | "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]中)
修改后的@Surendra Jnawali代码。失败
如果当前时间为23:40:00,即大于开始时间且小于等于23:59:59。
所有功劳归真实所有者所有
应该是这样的:这很完美
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 | 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"); } } |
结果
1 2 3 4 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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,
您也需要解析一天。
n
以下方法检查" validateTime"是否在" startTime"之间
n
对我说您的问题是"或"情况...您想检查time1> 20:11:13 OR time1 <14:49:00。
从20:11:13到另一端(14:49:00)的时间永远不会超过您的范围,反之亦然。认为它就像您正在检查时间是否不在正确排序的几个时间戳之间。
在@kocko的帮助下,完整的工作代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | 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(); } |
n
Java 8-LocalDateTime
那呢?
1 2 3 4 5 6 7 | 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 } |
n
在您的情况下,开始时间(20:11:13)大于结束时间(14:49:00)。有一个合理的假设,您可以通过在结束时间加上一天或从开始时间减去一天来解决问题。如果这样做,您将被困,因为您不知道测试时间是在哪一天。
您可以通过检查测试时间是否在结束时间和开始时间之间来避免此陷阱。如果为true,则结果为"介于两者之间";否则结果是"介于两者之间"。
这是我一直在使用的JAVA函数。到目前为止,它对我来说仍然有效。祝你好运。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | 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; } } |
要创建日历实例,可以使用:
1 2 3 4 |
n
n
实际工作功能如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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; } |
n
n
n
n
将$ time,$ to和$ from字符串中的冒号分隔开,转换为int,然后使用以下条件检查时间是否介于from和to之间。示例在php中,但没关系。
1 2 3 4 | if(($to < $from && ($time >= $from || $time <= $to)) || ($time >= $from && $time <= $to)) { return true; } |
n
n
抱歉,您需要输入sudo代码。我在打电话。 ;)
1 2 | between = (time < string2 && time > string1); if (string1 > string2) between = !between; |
如果它们是时间戳或字符串,则可以使用。只需将变量名称更改为match