特定设备(三星J7/Android9)出现DateTimeParseException问题求助
解决三星J7(Android 9)上的DateTimeParseException问题
问题重现
在三星J7(Android 9)设备上解析日期字符串 3/30/2023 12:00:00 AM 时触发 DateTimeParseException,报错信息为:
DateTimeParseException: Text '3/30/2023 12:00:00 AM' could not be parsed at index 19
相同代码在Pixel 4模拟器和三星A52s设备上运行正常。
解析代码:
fun numberOfDaysBetweenToday( dateTime: String, clock: Clock, zoneId: ZoneId, dateTimeFormatter: DateTimeFormatter ): Long { val now = Instant.now(clock).atZone(zoneId) val other = LocalDateTime.parse(dateTime, dateTimeFormatter).atZone(zoneId) return ChronoUnit.DAYS.between(now, other) }
调用方式:
numberOfDaysBetweenToday("3/30/2023 12:00:00 AM", ZoneId.of("Asia/Manila"), DateTimeFormatter.ofPattern("M/dd/yyyy h:mm:ss a"))
问题原因
Android 9及更早版本中,部分厂商(如三星)的设备默认Locale可能不是英文,或者系统对DateTimeFormatter的实现依赖系统Locale。当解析包含AM/PM的英文日期字符串时,如果DateTimeFormatter未指定英文Locale,系统会用当前设备的Locale去解析,导致无法识别AM/PM标识,触发解析异常。
解决方案
创建DateTimeFormatter时显式指定英文Locale(如Locale.US),确保解析规则与日期字符串的格式匹配:
修改后的调用代码:
numberOfDaysBetweenToday( "3/30/2023 12:00:00 AM", ZoneId.of("Asia/Manila"), DateTimeFormatter.ofPattern("M/dd/yyyy h:mm:ss a", Locale.US) )
验证说明
添加指定Locale后,DateTimeFormatter会强制使用英文的上午/下午标识规则解析,不受设备系统Locale影响,可在三星J7等老设备上正常解析目标日期字符串。
内容的提问来源于stack exchange,提问作者Alvin Dizon
相关产品推荐
相关产品推荐

