如何按当前时间从营业时间开启/关闭

时间:2018-04-10 10:41:36

标签: java android time kotlin compare

我有一个关于在线餐厅订单的android项目。我在时间逻辑上遇到了一些问题

我通过String打开或关闭餐厅:

  • 餐厅1:open at "16:00"close at "02.00"
  • 餐厅2:open at "02.00"close at "16:00"

如果这次at "18:00"餐厅1应该开放。

我已经尝试过这样的代码, 但餐厅1仍然关闭:

val open = "16:00"
val close = "02:00"
val calendar = Calendar.getInstance()
val time = calendar.time
val currentTime: String = SimpleDateFormat("HH:mm").format(time)

if(currentTime.compareTo(open) >= 0 currentTime.compareTo(close) < 0){
    // do something is open
}
else{
    // do something is close
}

我使用kotlin,也许有人可以帮我使用java

1 个答案:

答案 0 :(得分:3)

如果您要比较时间值(小时和分钟),则不应将它们作为字符串进行比较,而应将其与实际代表的内容进行比较:一天中的时间。

在java中有the java.time classes(在JDK&gt; = 8中)。在旧版本中,Threeten backport中提供了相同的类。

最初我以为我可以使用LocalTime(一个代表当天时间的类),但问题是本地时间从午夜开始到晚上11:59结束,所以它不能处理餐厅1的情况,该情况在下一个日结束。

因此,您必须在LocalDateTime(代表日期和时间)或ZonedDateTime(如果您想考虑夏令时效果)之间进行选择。我正在使用后者,但两种类型的代码相似:

// timezone I'm working on (use JVM default, or a specific one, like ZoneId.of("America/New_York")
ZoneId zone = ZoneId.systemDefault();
// today
LocalDate today = LocalDate.now(zone);

// times
// 16:00
LocalTime fourPM = LocalTime.of(16, 0); // or LocalTime.parse("16:00") if you have a String
// 02:00
LocalTime twoAM = LocalTime.of(2, 0); // or LocalTime.parse("02:00") if you have a String

// restaurant 1: opens today 16:00, closes tomorrow 02:00
ZonedDateTime rest1Start = today.atTime(fourPM).atZone(zone);
ZonedDateTime rest1End = today.plusDays(1).atTime(twoAM).atZone(zone);

// restaurant 2: opens today 02:00, closes today 16:00
ZonedDateTime rest2Start = today.atTime(twoAM).atZone(zone);
ZonedDateTime rest2End = today.atTime(fourPM).atZone(zone);

// time to check
String timeToCheck = "18:00";
// set time - or use ZonedDateTime.now(zone) to get the current date/time
ZonedDateTime zdt = today.atTime(LocalTime.parse(timeToCheck)).atZone(zone);

// check if it's open
if (rest1Start.isAfter(zdt) || rest1End.isBefore(zdt)) {
    // restaurant 1 is closed
} else {
    // restaurant 1 is open
}
// do the same with restaurant 2

如果您不需要考虑DST更改,可以使用LocalDateTime - 只需忽略对atZone的调用,结果为LocalDateTime