我有一个关于在线餐厅订单的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
如果要比较时间值(小时和分钟(,则不应将它们作为字符串进行比较,而应将它们作为它们真正表示的事物进行比较:一天中的时间。
在java中,有java.time类(在JDK中>= 8(。在旧版本中,Threeten 向后移植中提供了相同的类。
最初我以为我可以使用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
。