将日期和时间范围与 Java 进行比较

Compare Date and Time range with 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 的值为真。

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

并检查时间是否在这个时间之间。

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

正如 Pranav balu 所说,对您的数据使用 Java objects/data 结构。使用像 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, new AvailabilityRange("00:00", "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);

输出:

Is open? true

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