Java “查找当前时间在时间间隔之间”;周一至周五上午11:00至晚上9:00”;
使用SimpleDataFormat进行了尝试,但未获得以下预期结果:Java “查找当前时间在时间间隔之间”;周一至周五上午11:00至晚上9:00”;,java,android,datetime,kotlin,time,Java,Android,Datetime,Kotlin,Time,使用SimpleDataFormat进行了尝试,但未获得以下预期结果: Mon, 11:00 am - 9:00 pm Tue, 11:00 am - 9:00 pm Wed, 11:00 am - 9:00 pm Thu, 11:00 am - 9:00 pm Fri, 11:00 am - 9:00 pm 如果当前时间介于这两个时间之间,则需要返回true。您可以使用日历获取日期和时间值,然后只需检查日期和时间是否在所需范围内 val cal = Calendar.getInstance(
Mon, 11:00 am - 9:00 pm
Tue, 11:00 am - 9:00 pm
Wed, 11:00 am - 9:00 pm
Thu, 11:00 am - 9:00 pm
Fri, 11:00 am - 9:00 pm
如果当前时间介于这两个时间之间,则需要返回true。您可以使用
日历获取日期和时间值,然后只需检查日期和时间是否在所需范围内
val cal = Calendar.getInstance()
val day = cal.get(Calendar.DAY_OF_WEEK) // sunday 1.. saturday 7
val hour = cal.get(Calendar.HOUR_OF_DAY) // Hour in 24 hours format
return (day in Calendar.MONDAY..Calendar.FRIDAY && hour in 11..21)
java.time
我建议您使用它,它为您提供了一套丰富的API
import java.time.DayOfWeek;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.temporal.TemporalAdjusters;
public class Main {
public static void main(String[] args) {
// Change the time-zone as per your requirement e.g. ZoneId.of("Europe/London")
LocalDateTime now = LocalDateTime.now(ZoneId.systemDefault());
LocalDateTime end = now.with(TemporalAdjusters.previousOrSame(DayOfWeek.FRIDAY))
.withHour(21);
boolean valid = false;
for (LocalDateTime start = now.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY)); !start
.isAfter(end); start = start.plusDays(1)) {
if (!now.isBefore(start.withHour(11)) && !now.isAfter(start.withHour(21))) {
valid = true;
break;
}
}
if (!valid) {
System.out.println("Invalid");
} else {
System.out.println("Valid");
}
}
}
输出:
Valid
从了解现代日期时间API
java.util
的日期时间API及其格式化APISimpleDataFormat
已经过时,并且容易出错。建议完全停止使用,并切换到
- 无论出于何种原因,如果您必须坚持使用Java6或Java7,您可以使用哪个backport将大部分Java.time功能移植到Java6&7
- 如果您正在为Android项目工作,并且您的Android API级别仍然不符合Java-8,请检查并确认
假设您从某处以字符串形式读取每日营业时间(在良好的设计中,这是不必要的,但假设在您的情况下是必要的),您首先需要一个数据结构来存储它们。我建议使用地图
。我建议在每天的课时上如下的课
public class DailyHours {
private static final DateTimeFormatter timeParser = new DateTimeFormatterBuilder()
.parseCaseInsensitive()
.appendPattern("h:mm a")
.toFormatter(Locale.ENGLISH);
private LocalTime opens;
private LocalTime closes;
public DailyHours(String times) {
String[] hours = times.split(" - ");
if (hours.length != 2) {
throw new IllegalArgumentException("Improper format " + times + ", must be like 11:00 am - 9:00 pm");
}
opens = LocalTime.parse(hours[0], timeParser);
closes = LocalTime.parse(hours[1], timeParser);
}
public boolean isBetween(LocalTime time) {
return ! time.isBefore(opens) && time.isBefore(closes);
}
}
现在,我们可以通过以下方式将字符串读入地图:
String[] openingHoursTable = {
"Mon, 11:00 am - 9:00 pm",
"Tue, 11:00 am - 9:00 pm",
"Wed, 11:00 am - 9:00 pm",
"Thu, 11:00 am - 9:00 pm",
"Fri, 11:00 am - 9:00 pm"
};
Map<DayOfWeek, DailyHours> hoursPerDay = Arrays.stream(openingHoursTable)
.map(s -> s.split(", "))
.collect(Collectors.toMap(arr -> DayOfWeek.from(dayParser.parse(arr[0])),
arr -> new DailyHours(arr[1])));
完成后,我们可以随时检查是否在营业时间内:
ZonedDateTime currentTime = ZonedDateTime.now(ZoneId.systemDefault());
DailyHours todaysHours = hoursPerDay.get(currentTime.getDayOfWeek());
if (todaysHours == null) {
System.out.println("Closed today");
} else {
System.out.println("Open now? " + todaysHours.isBetween(currentTime.toLocalTime()));
}
刚刚跑步(我所在时区周五下午5:40),我得到:
现在开门?真的
链接:解释如何使用java.time。它回答了您的问题吗?它回答了你的问题吗?它回答了你的问题吗?或者Hi@LiveandLetLive谢谢你的推荐,它解决了一半的问题,我在将“周一至周四上午11:00-晚上10:00”转换为两个日期时遇到了问题。您能帮我一下吗?我建议您不要使用Java 1.0和1.1中的SimpleDataFormat
及其同类日期时间类。这些类设计得很糟糕,而且很早就过时了,SimpleDateFormat
尤其是出了名的麻烦。请改用。谢谢你的回答。如何将“周一至周四上午11:00-晚上10:00”转换为两个单独的日期?那么就很容易找到当前时间是否在这两个日期之间。你能解释一下为什么我的答案不能解决你的问题吗?我建议你不要使用日历。那门课设计得很糟糕,而且早已过时。而是使用来自的类。我不认为他知道你的观点。你是说谷歌-利用Java-从不阅读吗?我建议他们已经阅读过了。真的需要让代码更复杂吗,当同样的事情可以在3-4行中完成时code@mightyWOZ-如果您使用现代日期时间API发布一个不太复杂的答案,那就太好了。如果你不知道现代日期时间API,你应该学习它,而不是教别人使用坏掉的java.util
date-time API。@mightyWOZ-我回答的最后一点有帮助你使用java 8日期时间API的链接。@mightyWOZ-你检查过了吗?很可能会坏掉。不是这样,别担心。根据大多数经验,使用旧的、设计糟糕的日期和时间类更有可能中断。
ZonedDateTime currentTime = ZonedDateTime.now(ZoneId.systemDefault());
DailyHours todaysHours = hoursPerDay.get(currentTime.getDayOfWeek());
if (todaysHours == null) {
System.out.println("Closed today");
} else {
System.out.println("Open now? " + todaysHours.isBetween(currentTime.toLocalTime()));
}