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

新手上路,请多包涵

我有时间跨度:

字符串时间 1 = 01:00:00

字符串时间 2 = 05:00:00

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

Actually, 01:00:00 is greater than 20:11:13 and less than 14:49:00 considering 20:11:13 is always less than 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;
    }
 }

我知道这段代码在比较字符串对象时没有给出正确的结果。

如何做到这一点,因为它们是时间跨度而不是要比较的字符串?

原文由 My God 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 665
2 个回答

您可以使用 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();
}

原文由 Konstantin Yovkov 发布,翻译遵循 CC BY-SA 4.0 许可协议

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 表示仅没有日期和时区的时间。

所以我想要的是 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" );

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

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

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

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

该测试可以更简单地表述为“ 不在 凌晨 3 点到晚上 8 点之间”。然后我们可以推广到任何一对 LocalTime 对象,我们在其中测试 between 如果开始在停止之前使用 24 小时时钟,而 不是 between 如果开始在停止之后(如在这个问题)。

此外,时间跨度通常使用半开方法处理,其中开始是 包容性 的,而结束是 独占 的。因此,严格来说,“之间”比较是“目标是否等于或晚于开始且目标在停止之前”,或者更简单地说,“目标 不在 开始之前且在停止之前”。

 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 及更高版本中。这些类取代了麻烦的旧 日期时间类,例如 java.util.DateCalendarSimpleDateFormat

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

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

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

在哪里获取 java.time 类?

原文由 Basil Bourque 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题