Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java “查找当前时间在时间间隔之间”;周一至周五上午11:00至晚上9:00”;_Java_Android_Datetime_Kotlin_Time - Fatal编程技术网

Java “查找当前时间在时间间隔之间”;周一至周五上午11:00至晚上9:00”;

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(

使用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()
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及其格式化API
SimpleDataFormat
已经过时,并且容易出错。建议完全停止使用,并切换到

  • 无论出于何种原因,如果您必须坚持使用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()));
    }