Kotlin中如何从Google Material Time Picker获取AM/PM值
Kotlin 12小时制MaterialTimePicker获取AM/PM时段的实现方案
MaterialTimePicker 组件本身没有独立暴露获取AM/PM时段的接口,即使设置了TimeFormat.CLOCK_12H的展示格式,通过picker.hour获取的选中小时值,始终是0~23范围的24小时制整数,时段判断完全可以基于这个返回值直接推导。
时段判断规则
- 选中小时值在
0~11区间时,对应时段为AM(上午) - 选中小时值在
12~23区间时,对应时段为PM(下午/晚间)
补全后的完整回调逻辑
在原有代码的确认按钮回调中,替换为如下实现即可完成时间获取与展示:
binding.etFirstTime.setOnClickListener { val picker = MaterialTimePicker.Builder() .setTimeFormat(TimeFormat.CLOCK_12H) .setHour(12) .setMinute(10) .setTitleText("Select Shop's Timing") .build() picker.showNow(childFragmentManager, "Time") picker.addOnPositiveButtonClickListener { // 获取picker返回的24小时制选中值 val selectedHour24 = picker.hour val selectedMinute = picker.minute // 直接判断AM/PM val timePeriod = if (selectedHour24 < 12) "AM" else "PM" // 适配12小时制的展示数值(修正特殊边界值) val displayHour = when (selectedHour24) { 0 -> 12 // 凌晨0点对应12 AM in 13..23 -> selectedHour24 - 12 // 下午1点到23点转换为1-12的展示值 else -> selectedHour24 // 上午1-11点直接展示 } // 拼接时间字符串设置到输入框 binding.etFirstTime.setText("$displayHour:${String.format("%02d", selectedMinute)} $timePeriod") } }
常见踩坑提醒
- 不要误以为12小时制展示模式下,
picker.hour会返回1-12的12小时制数值,组件内部始终存储24小时制的原始时间值,这是Material官方组件的固定设计 - 注意边界值匹配:选中中午12点整时,
picker.hour返回值为12,必须归为PM时段;选中凌晨0点整时,返回值为0,必须归为AM时段,否则会出现时段错位 - 如果需要适配多语言环境下的本地化时段文案(例如中文环境展示“上午/下午”而非硬编码AM/PM),可以直接调用系统时间格式化接口生成对应文案,不需要自行写多语言映射
// 本地化时段文案获取示例 val calendar = Calendar.getInstance().apply { set(Calendar.HOUR_OF_DAY, picker.hour) set(Calendar.MINUTE, picker.minute) } val localizedPeriod = android.text.format.DateFormat.format("a", calendar)
内容的提问来源于stack exchange,提问作者Josus Praiser
相关产品推荐
相关产品推荐

