工作日的日历 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给我当天的全名?


我还尝试使用较新的 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 提示要看的方向。