哪个是表示Java对象中业务开放时间的最佳方式?

时间:2011-11-02 12:33:19

标签: java

我需要表示开放时间,以及在特定日期和时间返回true / false的方法。 是否有任何具有此功能的软件包?

编辑:基本上我需要用数据库或文件构造一个对象,然后对该对象执行基本检查,就好像它在某个时刻关闭一样。

问题是有些商家会在00:00之后有工作时间,所以它会在第二天重叠。 在这种情况下,我发现对象应该能够支持每天多个时间帧,也可以用来支持午餐刹车。

4 个答案:

答案 0 :(得分:7)

您可以使用Calendar创建课程,并查看其工作日和工作时间。

class BusinessHour{

public void isOpenNow(){
  Calendar calNow = Calendar.getInstance();
    //check the rules for example , if day is MOn-FRi and time is 9-18.
  }
}

我认为不会有现成的,因为每个企业都有自己的规范,如果可以配置以便它可以修复所有业务,可以在类外部提供conf参数以便更好地设计

答案 1 :(得分:3)

我使用以下Object在HashSet中存储OpeningHours。使用Midnight而不是“800”或“1600”的小时数可以很容易地简化下面的示例,但我喜欢这样。

public class OpeningHours {
  public enum DAY {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
  }

public OpeningHours(DAY day, Integer from, Integer to) {
    this.day = day;
    this.from = from; // format time using 800 for 8:00am or 2300 for 23:00
    this.to = to;
}

@Override
public String toString() {
    return "OpeningHours [day=" + day + ", from=" + from + ", to=" + to + ", isAllDay=" + isAllDay + "]";
}

public OpeningHours() {

}

public DAY day;
public Integer from;
public Integer to;
public boolean isAllDay = false;

public void isOpenx(DateTime start) {

}

public boolean isOpen(DateTime start) {

    if (day.ordinal() != start.getDayOfWeek() - 1) {
        return false;
    }

    if (isAllDay)
        return true;

    String f = String.format("%04d", from);
    String t = String.format("%04d", to);

    Integer fh = Integer.valueOf(f.substring(0, 2));
    Integer fm = Integer.valueOf(f.substring(2));

    Integer th = Integer.valueOf(t.substring(0, 2));
    Integer tm = Integer.valueOf(t.substring(2));

    DateTime intStart = start.withHourOfDay(fh).withMinuteOfHour(fm);
    DateTime intEnd = start.withHourOfDay(th).withMinuteOfHour(tm);

    if (intStart.equals(start) || intEnd.equals(start)) {
        return true;
    }
    if (intStart.isBefore(start) && intEnd.isAfter(start)) {
        return true;
    }

    return false;

}
}
HashSet<OpeningHours> hours = new HashSet<OpeningHours>();
hours.add(new OpeningHours(OpeningHours.DAY.MONDAY, 800, 1200));
hours.add(new OpeningHours(OpeningHours.DAY.MONDAY, 1230, 1600));


DateTime dateToCheck = new DateTime(2012, 9, 4, 8, 00, 0, 0);

for (OpeningHours item : hours) {
  boolean isOpen = item.isOpen(dateToCheck );
  if (isOpen){
    System.out.println("Is Open!");
  }
}

答案 2 :(得分:2)

可能没有一个包已经实现了您的确切业务逻辑。

例如,您是否需要覆盖一年中特定日期的标准开放日期,例如关闭特殊活动?那么公共假期呢,你会为这些开放吗?

我建议的简单解决方案是:

  1. 创建一个数据库表,其中(日期,开放时间,结束时间)为字段
  2. 创建一个以日期和时间为参数的函数,以及 在数据库表中查找是否在其中 给定日期的开启/关闭时间
  3. 提供简单的方法 业务用户在预填充后更新打开/关闭时间 他们有你的标准时间

答案 3 :(得分:2)

在Java 8中,您可以将其表示为一组openingTimes对象:

集合:

RAISERROR @msg, 16, 1

OpeningTimes

 Set<OpeningTimes> openingTimes = new HashSet<>();