Android DateTimeFormatter三星设备时间转换异常求助
解决Android三星设备Locale时间转换异常问题
问题原因
三星设备的Android系统对瑞典语(瑞典)Locale的AM/PM符号实现存在差异,未正确映射为瑞典语标准的"FM"(上午)和"EM"(下午),而是保留了美式的"AM"/"PM",导致时间格式化结果不符合预期。
解决方案
方案一:自定义AM/PM符号映射(推荐)
通过手动指定瑞典语的AM/PM对应符号,完全脱离系统Locale的默认实现,确保所有设备输出一致:
DateTimeFormatter parser = DateTimeFormatter.ofPattern("hh:mm a", Locale.US); // 构建自定义格式化器,硬编码瑞典语的AM/PM符号 DateTimeFormatter formatter = new DateTimeFormatterBuilder() .appendPattern("hh:mm ") .appendText(ChronoField.AMPM_OF_DAY, Map.of( 0, "FM", // 对应上午(AM) 1, "EM" // 对应下午(PM) )) .toFormatter(Locale.forLanguageTag("sv-SE")); LocalTime time = LocalTime.parse("06:45 AM", parser); String formatted = time.format(formatter);
方案二:验证系统Locale数据(排查用)
如果需要确认问题根源,可以打印三星设备上瑞典语Locale的AM/PM符号,验证系统返回值:
Locale svSe = new Locale("sv", "SE"); DateFormatSymbols symbols = DateFormatSymbols.getInstance(svSe); String[] amPm = symbols.getAmPmStrings(); // 输出AM/PM符号,若为"AM"/"PM"则说明系统Locale数据异常 Log.d("LocaleCheck", "AM: " + amPm[0] + ", PM: " + amPm[1]);
说明
方案一从根本上避免了系统Locale实现差异带来的问题,是跨设备一致性的最优解;方案二仅用于问题排查,无法直接解决异常。
内容的提问来源于stack exchange,提问作者Shobhith
相关产品推荐
相关产品推荐

