Android-检查当前时间是否在2个给定时间之间,以及星期几是否有效

Android-检查当前时间是否在2个给定时间之间,以及星期几是否有效,android,date,kotlin,Android,Date,Kotlin,如果时间介于开始和停止时间之间,并且在特定的一天,我必须采取行动。我在上引用了一些现有线程,以检查时间是否在指定的时间范围内 假设开始时间为23:00pm,停止时间为7:00am,当前时间为2:00am。只有时间有效性函数返回true。但是如果我在代码中包含days,函数将返回false。例如:用户选择[星期一、星期二、星期三]。即使星期四不在列表中,但结束时间为星期四上午7:00,也可以在星期三晚上23:00到星期四上午7:00之间的任何时间采取行动,但不能在星期四晚上23:00或列表中未提及

如果时间介于开始和停止时间之间,并且在特定的一天,我必须采取行动。我在上引用了一些现有线程,以检查时间是否在指定的时间范围内

假设开始时间为23:00pm,停止时间为7:00am,当前时间为2:00am。只有时间有效性函数返回true。但是如果我在代码中包含days,函数将返回false。例如:用户选择[星期一、星期二、星期三]。即使星期四不在列表中,但结束时间为星期四上午7:00,也可以在星期三晚上23:00到星期四上午7:00之间的任何时间采取行动,但不能在星期四晚上23:00或列表中未提及的任何日期采取行动

下面是我的代码:

private fun isCurrentTimeBetweenProvidedTime(context: Context): Boolean {
        var reg = "^([0-1][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$".toRegex()
        val startTime = getStartTime()
        val endTime = getEndTime()
        val currentTime = getCurrentTime()

        if (reg.containsMatchIn(startTime) && reg.containsMatchIn(endTime) && reg.containsMatchIn(currentTime)) {
            var valid = false

            var startTime = SimpleDateFormat("HH:mm:ss").parse(startTime)
            var startCalendar = Calendar.getInstance()
            startCalendar.time = startTime

            var currentTime = SimpleDateFormat("HH:mm:ss").parse(currentTime)
            var currentCalendar = Calendar.getInstance()
            currentCalendar.time = currentTime

            var endTime = SimpleDateFormat("HH:mm:ss").parse(endTime)
            var endCalendar = Calendar.getInstance()
            endCalendar.time = endTime

            if (currentTime.compareTo(endTime) < 0) {
                currentCalendar.add(Calendar.DATE, 1)
                currentTime = currentCalendar.time
            }

            if (startTime.compareTo(endTime) < 0) {
                startCalendar.add(Calendar.DATE, 1)
                startTime = startCalendar.time
            }

            if (currentTime.before(startTime)) {
                valid = false
            } else {
                if (currentTime.after(endTime)) {
                    endCalendar.add(Calendar.DATE, 1)
                    endTime = endCalendar.time
                }

                if (currentTime.before(endTime)) {
                    valid = true
                } else {
                    valid = false
                }
            }

            // This won't work if day is Thursday and time is 2:00am, even though time falls between 23:00-7:00
            var todayCalendar = Calendar.getInstance()
            if ((currentTime >= startTime && todayCalendar.get(Calendar.DAY_OF_WEEK) in selectedDays.values) &&
                    (currentTime <= endTime && (todayCalendar.get(Calendar.DAY_OF_WEEK) in selectedDays.values || todayCalendar.get(Calendar.DAY_OF_WEEK)-1 in selectedDays.values))) {
                Log.d(TAG, "Days are valid")
            }

            return valid
        }

        return false
    }
private fun iscurrentTimeBetween提供的时间(上下文:上下文):布尔值{
var reg=“^([0-1][0-9]| 2[0-3]):([0-5][0-9]):([0-5][0-9])$”。toRegex()
val startTime=getStartTime()
val endTime=getEndTime()
val currentTime=getCurrentTime()
if(注册ContainsMachin(开始时间)和注册ContainsMachin(结束时间)和注册ContainsMachin(当前时间)){
var valid=false
var startTime=SimpleDateFormat(“HH:mm:ss”).parse(startTime)
var startCalendar=Calendar.getInstance()
startCalendar.time=startTime
var currentTime=SimpleDataFormat(“HH:mm:ss”).parse(currentTime)
var currentCalendar=Calendar.getInstance()
currentCalendar.time=当前时间
var endTime=SimpleDateFormat(“HH:mm:ss”).parse(endTime)
var endCalendar=Calendar.getInstance()
endCalendar.time=endTime
如果(currentTime.compareTo(endTime)<0){
currentCalendar.add(Calendar.DATE,1)
currentTime=currentCalendar.time
}
如果(开始时间比较到(结束时间)<0){
startCalendar.add(Calendar.DATE,1)
startTime=startCalendar.time
}
if(当前时间之前(开始时间)){
有效=错误
}否则{
如果(当前时间之后)(结束时间)){
endCalendar.add(Calendar.DATE,1)
endTime=endCalendar.time
}
if(当前时间之前(结束时间)){
有效=真
}否则{
有效=错误
}
}
//如果一天是星期四,时间是凌晨2:00,即使时间在23:00-7:00之间,这也不起作用
var todayCalendar=Calendar.getInstance()
如果((currentTime>=startTime&&todayCalendar.get(Calendar.DAY\u OF\u WEEK)在所选的Days.values中)&&

(currentTime一种可能的方法是将您的所有时间标准化为与选定的一周起始点的偏移量,例如周日12:00am=0。将您的所有时间转换为自起始点起的分钟数。然后只需检查您选择的时间(也转换为自起始点起的分钟数)属于任何范围。

java.time和ThreeTenABP 请注意:这段代码可以在Android API的26级以下和26级以上的级别上工作。我将进一步解释。我将不得不相信你能从Java代码中翻译出来

如果我正确理解了您的要求:

    ZoneId zone = ZoneId.of("America/Chihuahua");

    LocalTime startTime = LocalTime.of(23, 0);
    LocalTime endTime = LocalTime.of(7, 0);
    Set<DayOfWeek> selectedDays
            = EnumSet.of(DayOfWeek.MONDAY, DayOfWeek.TUESDAY, DayOfWeek.WEDNESDAY);

    ZonedDateTime now = ZonedDateTime.now(zone);
    LocalTime timeNow = now.toLocalTime();
    DayOfWeek currentDayOfWeek = now.getDayOfWeek();
    boolean inIntervalOnDay;
    if (startTime.isAfter(endTime)) { // crosses midnight
        if (timeNow.isBefore(endTime)) { // in interval, after midnight
            // Day is correct if the day before is among the selected days
            inIntervalOnDay = selectedDays.contains(currentDayOfWeek.minus(1));
        } else if (timeNow.isBefore(startTime)) {
            inIntervalOnDay = false;
        } else { // after start time, before midnight
            inIntervalOnDay = selectedDays.contains(currentDayOfWeek);
        }
    } else {
        inIntervalOnDay = ! timeNow.isBefore(startTime)
                && timeNow.isBefore(endTime)
                && selectedDays.contains(currentDayOfWeek);
    }
    System.out.println("Now: " + now + " (" + currentDayOfWeek + ") Valid? " + inIntervalOnDay);
ZoneId zone=ZoneId.of(“美洲/吉娃娃”);
LocalTime startTime=LocalTime.of(23,0);
LocalTime endTime=LocalTime.of(7,0);
设置所选日期
=枚举集(星期一、星期二、星期三);
ZonedDateTime now=ZonedDateTime.now(区域);
LocalTime timeNow=now.toLocalTime();
DayOfWeek currentDayOfWeek=now.getDayOfWeek();
间隔日内的布尔值;
如果(startTime.isAfter(endTime)){//跨越午夜
如果(timeNow.isBefore(endTime)){//在时间间隔内,在午夜之后
//如果前一天在所选日期中,则日期是正确的
inIntervalOnDay=selectedDays.contains(currentDayOfWeek.减号(1));
}else if(timeNow.isBefore(startTime)){
inIntervalOnDay=假;
}否则{//在开始时间之后,午夜之前
inIntervalOnDay=selectedDays.contains(currentDayOfWeek);
}
}否则{
inIntervalOnDay=!timeNow.isBefore(startTime)
&&timeNow.isBefore(endTime)
&&selectedDays.contains(currentDayOfWeek);
}
System.out.println(“现在:+Now+”(“+currentDayOfWeek+”)有效?”+inIntervalOnDay);
刚才我运行代码段时,输出是:

现在:2019-09-27T03:47:56.856-06:00[美国/吉娃娃](星期五)有效?错误

如果你想要的时区不是美国/吉娃娃,请用它代替。时区很重要

问题:我可以在API级别低于26的Android上使用java.time吗?如何使用? 是的,java.time在较旧和较新的Android设备上运行良好。它至少需要Java6

  • 在Java8和更高版本以及更新的Android设备上(API级别26),现代API是内置的
  • 在Java6和Java7中,获取三个后端口,即现代类的后端口(三个十用于JSR310;参见底部的链接)
  • 在(较旧的)Android上,使用Android版的ThreeTen Backport。它被称为ThreeTenABP。并确保您使用子包从
    org.ThreeTen.bp
    导入日期和时间类
链接
  • 解释如何使用java.time
  • ,其中首先描述了
    java.time
  • ,java.time的后端口
到Java6和Java7(JSR-310为三十)
  • ,Android版Three Ten Backport
  • ,解释得非常透彻

  • 谢谢@dharms!你的方法给了我另一个想法。如果我的开始时间是23:00,结束时间是第二天的7:00,那么23:00的毫秒时间将大于7:0的毫秒时间