获取特定周的日索引

问题描述 投票:0回答:1

我尝试获取特定周的索引(从 0 到 6)。

对于一周从周一到周日开始的国家/地区,这可以正常工作。

fun getDayOfWeek(date: LocalDate): Int {
    val dayOfWeek = date.dayOfWeek.value - 1
    return dayOfWeek
}

现在的问题是,是否有一个国家像美国一样,一周从周日到周六。如何获取智能手机本地化给出的星期索引? 这样,对于一周从星期一开始的国家/地区,它返回 0 到 6(星期一到星期日);对于一周从星期日开始的国家/地区,它返回 0 到 6(星期日到星期六)?

android kotlin date localization
1个回答
0
投票

要根据智能手机的本地化处理不同的周开始首选项(星期一与星期日),您可以使用 java.time.temporal.WeekFields 类。 WeekFields 类允许您根据用户的区域设置确定一周的第一天。以下是您可以修改代码以实现本地化的方法:

import java.time.LocalDate
import java.time.temporal.WeekFields
import java.util.Locale

fun getDayOfWeekLocalized(date: LocalDate, locale: Locale = Locale.getDefault()): Int {
    // Get the WeekFields for the given locale
    val weekFields = WeekFields.of(locale)
    // Determine the first day of the week
    val firstDayOfWeek = weekFields.firstDayOfWeek
    // Get the localized day of week (adjusted to 0-based index)
    return (date.dayOfWeek.value - firstDayOfWeek.value + 7) % 7
}

说明:

  • 区域设置敏感周开始:

WeekFields.of(locale) 根据 Locale 确定一周的第一天。例如,在美国区域设置中,一周从星期日开始。对于大多数欧洲地区,它从星期一开始。

  • 调整星期几值:

date.dayOfWeek.value 提供从 1 开始的索引(星期一 = 1,...,星期日 = 7)。 减去一周第一天的值 (firstDayOfWeek.value) 以使其与本地化的开始时间对齐。 使用 (value + 7) % 7 处理环绕并确保结果是从 0 开始的。

  • 可选区域设置参数:

使用 Locale.getDefault() 检索默认区域设置,但您也可以传递特定区域设置来测试其他区域。

示例

fun main() {
    val date = LocalDate.of(2024, 12, 8) // Sunday
    println(getDayOfWeekLocalized(date)) // Output depends on the device's locale
    println(getDayOfWeekLocalized(date, Locale.US)) // Output: 0 (Sunday in US locale)
    println(getDayOfWeekLocalized(date, Locale.FRANCE)) // Output: 6 (Sunday in France locale)
}

该解决方案确保索引根据智能手机的定位正确调整。

© www.soinside.com 2019 - 2024. All rights reserved.