微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

工作时间内的时间 - 在 Kotlin 中检查一个班轮

如何解决工作时间内的时间 - 在 Kotlin 中检查一个班轮

当列表项业务工作时,我需要在 recyclerView 中显示一个红点,而当它不工作时显示红色。

我使用数据绑定 API 24,能够使用 Java 8 调用(尤其是 API 26 新 java.Time 及其 LocalTimeLocalDate)。>

//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#isAfterLocalTime#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

ONLINE DEMO

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 desugaringHow 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 举报,一经查实,本站将立刻删除。