我需要表示开放时间,以及在特定日期和时间返回true / false的方法。 是否有任何具有此功能的软件包?
编辑:基本上我需要用数据库或文件构造一个对象,然后对该对象执行基本检查,就好像它在某个时刻关闭一样。
问题是有些商家会在00:00之后有工作时间,所以它会在第二天重叠。 在这种情况下,我发现对象应该能够支持每天多个时间帧,也可以用来支持午餐刹车。
答案 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)
可能没有一个包已经实现了您的确切业务逻辑。
例如,您是否需要覆盖一年中特定日期的标准开放日期,例如关闭特殊活动?那么公共假期呢,你会为这些开放吗?
我建议的简单解决方案是:
答案 3 :(得分:2)
在Java 8中,您可以将其表示为一组openingTimes对象:
集合:
RAISERROR @msg, 16, 1
OpeningTimes
Set<OpeningTimes> openingTimes = new HashSet<>();