如何解决工作时间内的时间 - 在 Kotlin 中检查一个班轮
当列表项业务工作时,我需要在 recyclerView 中显示一个红点,而当它不工作时显示红色。
我使用数据绑定 API 24,能够使用 Java 8 调用(尤其是 API 26 新 java.Time 及其 LocalTime
和 LocalDate
)。>
//Get local date way 1
var day: String = LocalDate.Now().dayOfWeek.name
var time: String = LocalTime.Now().toString()//.hour.toString()
//Get local date way 2
val calendar = Calendar.getInstance()
val dateInfo = DateFormat.getDateInstance(DateFormat.FULL).format(calendar.time)
//Get local date way 3
var date = Date()
我从服务器收到以下格式的工作时间:
"schedule_1": "09:00 22:00","schedule_2": "09:00 22:00","schedule_3": "09:00 22:00","schedule_4": "09:00 22:00","schedule_5": "09:00 22:00","schedule_6": "09:00 17:00","schedule_7": "",
每个时间表都是一周中的某一天,所以我需要检查它是否是今天。
Stack Overflow 上的大多数问题比较两个时间戳或两个日期,它们都是一页纸,但我希望在工作时间内有时间一行。
解决方法
java.time
java.util
日期时间 API 及其格式化 API SimpleDateFormat
已过时且容易出错。建议完全停止使用它们并切换到 modern Date-Time API*。
使用 java.time
(现代日期时间 API)的解决方案:
您可以使用函数 LocalTime#isAfter
和 LocalTime#isBefore
将当前时间与营业时间的开始和结束进行比较。
演示:
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
import java.util.Map;
public class Main {
public static void main(String[] args) {
//Test
System.out.println(isBusinessHour());
}
static boolean isBusinessHour() {
boolean businessHour = false;
Map<String,String> map = Map.of(
"schedule_1","09:00 22:00","schedule_2","schedule_3","schedule_4","schedule_5","schedule_6","09:00 17:00","schedule_7",""
);
LocalDateTime ldt = LocalDateTime.now(ZoneId.of("Europe/Moscow"));
String key = "schedule_" + ldt.getDayOfWeek().getValue();
String[] businessHours = map.get(key).split(" ");
if(businessHours.length == 2) {
LocalTime start = LocalTime.parse(businessHours[0]);
LocalTime end = LocalTime.parse(businessHours[1]);
LocalTime now = ldt.toLocalTime();
businessHour = !now.isBefore(start) && !now.isAfter(end);
}
return businessHour;
}
}
样本运行的输出:
false
从 Trail: Date Time 了解有关现代 Date-Time API 的更多信息。
* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 & 7. 如果您正在为 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaring 和 How to use ThreeTenABP in Android Project。
,工作时间在绿色和红色之间切换的图标颜色色调实现。
@BindingAdapter("app:workingHoursColoredDot")
fun workingHoursColoredDot(view: ImageView,terminalItem:NetworkTerminal){
terminalItem?.let {
var day = LocalDate.now().dayOfWeek.value//.ordinal
var time = LocalTime.now()
val networkDate = when (day) {
1 -> terminalItem.schedule_1
2 -> terminalItem.schedule_2
3 -> terminalItem.schedule_3
4 -> terminalItem.schedule_4
5 -> terminalItem.schedule_5
6 -> terminalItem.schedule_6
7 -> terminalItem.schedule_7
else -> throw IllegalArgumentException()
}
Log.d("BindingAdapters","val networkDate = terminalItem.schedule_1 $networkDate")
if (!networkDate.isNullOrEmpty()) {
val (startTimeString,endTimeString) = networkDate.split(" ")
Log.d("BindingAdapters","val (startTime,endTime) = $startTimeString $endTimeString")
val startTime: LocalTime = LocalTime.parse(startTimeString,DateTimeFormatter.ofPattern("H:mm"))
val endTime: LocalTime= LocalTime.parse(endTimeString,DateTimeFormatter.ofPattern("H:mm"))
var businessWorking = time.isAfter(startTime) and time.isBefore(endTime)
if (businessWorking)view.backgroundTintList = ContextCompat.getColorStateList(view.context,R.color.green_dot) else view.backgroundTintList = ContextCompat.getColorStateList(view.context,R.color.red)
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。