在12小时的时间跨度内检查时间是否介于两次之间

时间:2015-10-21 21:28:08

标签: java date calendar simpledateformat

以下代码我正在尝试的是,如果我正在检查的时间是在我第一次与之比较之前。

如果timeToCompare在下午6点之后变得很好,如果它位于两个时间段之间,它的工作正常,但只有在01:00:00 AM,这不是在时间范围内,但仍然会进入条件。

如果出错,请更正。

    String string1 = "07:00:00 AM";
    Date time1 = new SimpleDateFormat("HH:mm:ss a").parse(string1);
    Calendar calendar1 = Calendar.getInstance();
    calendar1.setTime(time1);


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

    String timeToCompare = "01:00:00 AM";
    System.out.println(formattedDate);
    Date d = new SimpleDateFormat("HH:mm:ss a").parse(timeToCompare);
    Calendar calendar3 = Calendar.getInstance();
    calendar3.setTime(d);
    calendar3.add(Calendar.DATE, 1);

我的timeToCompare但是在string1和string2之间

    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("Hi from time between given slots");
    }

凌晨1点00:00不在这段时间的中间,但是如果条件允许的话仍然是gogin并且它正在哼唱"嗨,从给定时段之间的时间开始#34;

2 个答案:

答案 0 :(得分:3)

您要在字符串2和字符串3中添加一天。在内部,Java将您的时间存储如下:

> calendar1.getTime()
Thu Jan 01 07:00:00 CST 1970
> calendar2.getTime()
Fri Jan 02 06:00:00 CST 1970
> calendar3.getTime()
Fri Jan 02 01:00:00 CST 1970

所以,你的时间范围比你想象的要大!

答案 1 :(得分:0)

不正确的分析模式

你应该使用小写hh一小时值1-12。大写HH用于24小时制0-23。

java.time

您应该使用Java 8及更高版本中内置的新java.time框架。旧的java.util.Date/.Calendar和SimpleDateFormat类非常麻烦。

新框架包含一个仅限时间值的类LocalTime。此类没有日期,也没有时区。但请注意如何确定当前时间所需的时区。

String string1 = "07:00:00 AM";
String string2 = "06:00:00 PM";
String string3 = "01:00:00 AM";

DateTimeFormatter formatter = DateTimeFormatter.ofPattern ( "hh:mm:ss a" , Locale.ENGLISH );

LocalTime localTime1 = formatter.parse ( string1 , LocalTime :: from );
LocalTime localTime2 = formatter.parse ( string2 , LocalTime :: from );
LocalTime localTime3 = formatter.parse ( string3 , LocalTime :: from );
LocalTime now = LocalTime.now ( ZoneId.of ( "America/Montreal" ) );

这些LocalTime对象具有方便的isBeforeisAfterisEqual方法。

Boolean isFirstInputEarlierThanNow = localTime1.isBefore ( now );

LocalTime类还实现了Comparable接口。因此,您可以按照此示例代码中的说明对它们进行排序。

List<LocalTime> localTimes = Arrays.asList ( localTime1 , localTime2 , localTime3 , now );
Collections.sort ( localTimes );

LocalTime earliest = localTimes.get ( 0 ); // Index, meaning zero-based counting.
LocalTime latest = localTimes.get ( localTimes.size () - 1 ); // Index (zero-based counting), so subtract one.

转储到控制台。

System.out.println ( "localTimes: " + localTimes );
System.out.println ( "isFirstInputEarlierThanNow: " + isFirstInputEarlierThanNow );
System.out.println ( "earliest: " + earliest + " … latest: " + latest );

跑步时。

  

localTimes:[01:00,07:00,18:00,19:26:41.932]

     

isFirstInputEarlierThanNow:true

     

最早:01:00 ...最新:19:26:41.932