0

我有这个输入:

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

这是需要比较的日期和时间

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

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

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

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

在这种情况下, 的值isOpen将是真实的。

4

2 回答 2

1

我会通过使用两个地图来解决这个问题,其中 key 为 day,from time 作为第一个 map 的 value,time 作为第二个 map 的 value。

并检查时间是否介于此时间之间。

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

于 2020-10-16T19:11:27.190 回答
1

正如 Pranav balu 已经说过的,为您的数据使用 Java 对象/数据结构。使用 JSON 库(如 Jackson 或 Gson)将 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);

输出:

开了?真的

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

于 2020-10-16T19:44:21.683 回答