我有一个关于在线餐厅订单的android
项目。我在时间逻辑上遇到了一些问题
我通过String
打开或关闭餐厅:
open at "16:00"
和close at "02.00"
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
答案 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
。