使用Java比较日期和时间范围

问题描述

我有这个输入:

{
  "MONDAY" : "02:39:00"
}

需要比较的日期和时间

  "availability" : {
    "SUNDAY" : {
      "from" : "00:00","to" : "10:00"
    },"MONDAY" : {
      "from" : "00:00","to" : "10:00"
    }
  }

如果availability实际上包含查询02:39:00中的时间在其中的DAY,那么最好的比较方法是什么。

因此,它可以以Java形式表示:

boolean isOpen = checkIfOpen("MONDAY","02:39:00",availabilityJSONObject);

在这种情况下,isOpen的值为true。

解决方法

我将通过使用两个图作为键来解决这个问题,其中键作为日期,时间作为第一个地图的值,时间作为第二个地图的值。

然后检查时间是否介于此时间之间。

您可以使用gson将json转换为java对象。

,

正如Pranav balu所说的,对数据使用Java对象/数据结构。使用像Jackson或Gson这样的JSON库将JSON输入转换为Java类型。您将需要Java类型的每日可用性范围。例如:

public class AvailabilityRange {

    LocalTime opens;
    LocalTime closes;
    
    public AvailabilityRange(String from,String to) {
        opens = LocalTime.parse(from);
        closes = LocalTime.parse(to);
    }
    
    public boolean inRange(String timeString) {
        LocalTime time = LocalTime.parse(timeString);
        return (! time.isBefore(opens)) && time.isBefore(closes);
    }
}

我提供了一个接受String参数的便捷构造函数和一种便捷方法。您可能需要一个接受LocalTime或两者都接受的构造函数和方法。

示例用法:

        Map<DayOfWeek,AvailabilityRange> availability
                = new EnumMap<DayOfWeek,AvailabilityRange>(
                        Map.of(DayOfWeek.SUNDAY,new AvailabilityRange("00:00","10:00"),DayOfWeek.MONDAY,"10:00")));
        
        String dayString = "MONDAY";
        String timeString = "02:39:00";
        
        boolean isOpen;
        AvailabilityRange availabilityForDay
                = availability.get(DayOfWeek.valueOf(dayString));
        if (availabilityForDay == null) {
            isOpen = false;
        } else {
            isOpen = availabilityForDay.inRange(timeString);
        }
        
        System.out.println("Is open? " + isOpen);

输出:

营业吗?是

我正在利用您的时间字符串采用ISO 8601格式的事实,并且LocalTime将此格式解析为默认格式,即没有任何显式格式化程序。秒是格式上的可选内容,因此00:0002:39:00都被解析。