【发布时间】:2019-09-26 15:49:31
【问题描述】:
如果时间介于开始时间和停止时间之间以及特定日期,我必须采取行动。我参考了SO上的一些现有线程来检查时间是否在指定的时间范围内。
假设开始时间是下午 23:00,停止时间是上午 7:00,当前时间是上午 2:00。只是时间有效性函数返回 true。但如果我在这段代码中包含天数,该函数将返回 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
}
我该如何处理这些日子场景?
【问题讨论】:
-
考虑扔掉早已过时且臭名昭著的麻烦
SimpleDateFormat和朋友,并将ThreeTenABP 添加到您的Android 项目中,以便使用java.time,现代Java 日期和时间API。使用起来非常好,并且会更好地支持您的任务。 -
在我看来这是一个重复的问题。也许不是以前的一个问题,但如果你结合例如Check if a given time lies between two times regardless of date 和What is the easiest way to get the current day of the week in Android??
-
我理解正确吗?在您的示例中,您希望在星期一 23 点和星期二 7 点之间以及在星期二和星期三之间以及星期三和星期四之间的晚上采取类似的行动?但是不是星期一 7 点之前和 不是星期四 23 点之后?