工作日的日历 getDisplayName 在不同的 Android 版本中给出不同的输出
Calendar getDisplayName for weekday gives different output in different Android versions
我正在消费API那个returns各个商家的营业时间。
我的时间是这样的:
[
{ "day": "monday", "isOpen": true, "open": "09:00", "close": "15:00"},
{ "day": "tuesday", "isOpen": true, "open": "09:00", "close": "15:00" },
{ "day": "wednesday", "isOpen": true, "open": "09:00", "close": "15:00" },
{ "day": "thursday", "isOpen": true, "open": "09:00", "close": "15:00" },
{ "day": "friday", "isOpen": true, "open": "09:00", "close": "15:00" },
{ "day": "saturday", "isOpen": false, "open": "", "close": "" },
{ "day": "sunday", "isOpen": false, "open": "", "close": "" },
]
我有以下功能,应该从列表中获取今天的时间并显示它们(DaySchedule
类型是由上面的数据结构构成的 data class
):
fun todayWorkingHours(schedule: List<DaySchedule>): String {
val cal = Calendar.getInstance()
val todayDay = cal.getDisplayName(Calendar.DAY_OF_WEEK, Calendar.LONG, Locale.ROOT)!!.toLowerCase(Locale.ROOT)
val workSchedule = schedule.find { it.day == todayDay }
?: return context.getString(R.string.non_working_day)
if (workSchedule.isOpen) {
val open = workSchedule.open
val close = workSchedule.close
return "${currentDay.capitalize(Locale.getDefault())}: $open - $close"
}
return "${currentDay.capitalize(Locale.getDefault())}: " + context.getString(R.string.non_working_day)
}
我有 Android 设备 运行 版本 7 (Samsung Galaxy S6) 和 11 (Google Pixel 3a) 用于测试。在 v7 上,此代码完美运行。但是,在 v11 上,它总是 returns R.string.non_working_day
中的消息。
使用调试器,我确定问题出在函数的第二行:
- Android 7 -
todayDay
是 "tuesday"
- Android 11 -
todayDay
是 "tue"
如何让所有版本的Android给我当天的全名?
我还尝试使用较新的 java.time
API(coreLibraryDesugaringEnabled
用于较旧的 OS 版本):
val todayDay = DayOfWeek.from(LocalDate.now()).getDisplayName(TextStyle.FULL, Locale.ROOT).toLowerCase(Locale.ROOT)
它做同样的事情 - 它在旧版本上给出正确的 "tuesday"
而在 Android 上给出不正确的 "tue"
11。虽然我找不到关于旧版本 Calendar
类、the Android docs for java.time.format.TextStyle
明确表示 TextStyle.LONG
应该给我完整的月份名称。
显然 Locale.ROOT
中存在错误。切换到 Locale.ENGLISH
使其正常工作,我知道服务器将始终使用英语。
感谢 @MatPag 提示要看的方向。
我正在消费API那个returns各个商家的营业时间。
我的时间是这样的:
[
{ "day": "monday", "isOpen": true, "open": "09:00", "close": "15:00"},
{ "day": "tuesday", "isOpen": true, "open": "09:00", "close": "15:00" },
{ "day": "wednesday", "isOpen": true, "open": "09:00", "close": "15:00" },
{ "day": "thursday", "isOpen": true, "open": "09:00", "close": "15:00" },
{ "day": "friday", "isOpen": true, "open": "09:00", "close": "15:00" },
{ "day": "saturday", "isOpen": false, "open": "", "close": "" },
{ "day": "sunday", "isOpen": false, "open": "", "close": "" },
]
我有以下功能,应该从列表中获取今天的时间并显示它们(DaySchedule
类型是由上面的数据结构构成的 data class
):
fun todayWorkingHours(schedule: List<DaySchedule>): String {
val cal = Calendar.getInstance()
val todayDay = cal.getDisplayName(Calendar.DAY_OF_WEEK, Calendar.LONG, Locale.ROOT)!!.toLowerCase(Locale.ROOT)
val workSchedule = schedule.find { it.day == todayDay }
?: return context.getString(R.string.non_working_day)
if (workSchedule.isOpen) {
val open = workSchedule.open
val close = workSchedule.close
return "${currentDay.capitalize(Locale.getDefault())}: $open - $close"
}
return "${currentDay.capitalize(Locale.getDefault())}: " + context.getString(R.string.non_working_day)
}
我有 Android 设备 运行 版本 7 (Samsung Galaxy S6) 和 11 (Google Pixel 3a) 用于测试。在 v7 上,此代码完美运行。但是,在 v11 上,它总是 returns R.string.non_working_day
中的消息。
使用调试器,我确定问题出在函数的第二行:
- Android 7 -
todayDay
是"tuesday"
- Android 11 -
todayDay
是"tue"
如何让所有版本的Android给我当天的全名?
我还尝试使用较新的 java.time
API(coreLibraryDesugaringEnabled
用于较旧的 OS 版本):
val todayDay = DayOfWeek.from(LocalDate.now()).getDisplayName(TextStyle.FULL, Locale.ROOT).toLowerCase(Locale.ROOT)
它做同样的事情 - 它在旧版本上给出正确的 "tuesday"
而在 Android 上给出不正确的 "tue"
11。虽然我找不到关于旧版本 Calendar
类、the Android docs for java.time.format.TextStyle
明确表示 TextStyle.LONG
应该给我完整的月份名称。
显然 Locale.ROOT
中存在错误。切换到 Locale.ENGLISH
使其正常工作,我知道服务器将始终使用英语。
感谢 @MatPag 提示要看的方向。