检查给定时间是否介于两个时间之间,而不考虑日期tl;博士java.time.LocalTime关于 java.time

2022-08-31 15:16:23

我有时间跨度:

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

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

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

实际上,大于和小于考虑总是小于 。这是给定的先决条件。01:00:0020:11:1314:49:0020:11:1314: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;
    }
 }

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

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


答案 1

您可以使用该类进行检查。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();
}

答案 2

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

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

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

该测试可以更简单地表示为“不在凌晨3点到晚上8点之间”。然后,我们可以推广到任何一对对象,如果开始时间在停止之前以24小时时钟出现,那么我们测试它们之间,如果开始时间在停止之后,则不在此之间(如本问题所示)。LocalTime

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

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 驱动程序。不需要字符串,不需要类。Hibernate 5 & JPA 2.2 支持 java.timejava.sql.*

从哪里获取 java.time 类?