You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Jetpack Compose时间选择器中显示AM/PM标识

解决Jetpack Compose时间选择器显示AM/PM并保存时段偏好的问题

核心问题分析

你当前的代码仅格式化了小时和分钟,未利用timePickerState提供的hourOfDay字段判断时段(AM/PM);同时若需在组件重建(如屏幕旋转)时保留用户选择,需要确保状态被正确持久化。


1. 实现AM/PM标识显示

当is24Hour=false时,timePickerState.hour返回12小时制数值(1-12),而hourOfDay始终为24小时制(0-23),可通过后者精准判断时段:

  • hourOfDay < 12 对应AM
  • hourOfDay >= 12 对应PM

修改时间格式化逻辑:

// 生成带AM/PM的格式化时间
val period = if (timePickerState.hourOfDay < 12) "AM" else "PM"
val formattedTime = "%02d:%02d %s".format(timePickerState.hour, timePickerState.minute, period)

2. 保存用户时段选择偏好

rememberTimePickerState内部已基于rememberSaveable实现组件内状态保存,若需进一步确保状态不丢失,可显式监听时间变化并持久化:

// 用rememberSaveable保存初始时间,确保组件重建时保留用户选择
val savedHourOfDay = rememberSaveable { mutableStateOf(currentTime[Calendar.HOUR_OF_DAY]) }
val savedMinute = rememberSaveable { mutableStateOf(currentTime[Calendar.MINUTE]) }

val timePickerState = rememberTimePickerState(
    initialHour = savedHourOfDay.value,
    initialMinute = savedMinute.value,
    is24Hour = false,
)

// 监听时间选择变化,更新保存的状态
LaunchedEffect(timePickerState.hourOfDay, timePickerState.minute) {
    savedHourOfDay.value = timePickerState.hourOfDay
    savedMinute.value = timePickerState.minute
}

完整修正代码

Column(
    modifier = Modifier.fillMaxSize(),
    horizontalAlignment = Alignment.CenterHorizontally,
    verticalArrangement = Arrangement.Center,
) {
    val currentTime = Calendar.getInstance()

    // 持久化用户选择的时间状态
    val savedHourOfDay = rememberSaveable { mutableStateOf(currentTime[Calendar.HOUR_OF_DAY]) }
    val savedMinute = rememberSaveable { mutableStateOf(currentTime[Calendar.MINUTE]) }

    val timePickerState = rememberTimePickerState(
        initialHour = savedHourOfDay.value,
        initialMinute = savedMinute.value,
        is24Hour = false,
    )

    // 同步时间选择到持久化状态
    LaunchedEffect(timePickerState.hourOfDay, timePickerState.minute) {
        savedHourOfDay.value = timePickerState.hourOfDay
        savedMinute.value = timePickerState.minute
    }

    // 格式化带AM/PM的时间
    val period = if (timePickerState.hourOfDay < 12) "AM" else "PM"
    val formattedTime = "%02d:%02d %s".format(timePickerState.hour, timePickerState.minute, period)

    Text(text = formattedTime)

    TimePicker(
        state = timePickerState,
    )
}

关键说明

  • is24Hour参数仅控制时间选择器的显示模式,和当前时段(AM/PM)无关,不能直接用来判断时段。
  • hour是12小时制数值(1-12),hourOfDay是24小时制数值(0-23),后者更适合用于判断AM/PM。

内容的提问来源于stack exchange,提问作者Bob Rasner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 03:28:08