Android中如何根据时区显示IST/EST标识并在TextView中展示?
在Android中显示时区标识为IST/EST的解决方案
你说的这个情况我碰到过——单元测试里用SimpleDateFormat的z格式符能完美输出「2018-04-25T12:40:15 IST」,但放到实际Android应用里就不行了对吧?这主要是因为桌面JVM和Android Runtime的时区数据处理逻辑不一样:单元测试用的是JVM自带的时区库,里面包含了IST/EST这类短缩写的映射;而Android设备上的SimpleDateFormat可能会输出更长的时区名称(比如「India Standard Time」)。
下面给你两种靠谱的解决办法:
方案一:用Java 8+日期API(推荐)
Android 8.0(API 26)及以上原生支持java.time包,低版本的话可以用ThreeTenABP兼容库来搞定。这个API的时区处理比老的SimpleDateFormat规范得多,能稳定输出短缩写:
// 获取当前系统时区的时间 ZonedDateTime currentTime = ZonedDateTime.now(ZoneId.systemDefault()); // 定义格式化模板 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss z"); // 生成最终的字符串 String formattedTime = currentTime.format(formatter); // 设置到TextView里 yourTextView.setText(formattedTime);
这样输出的结果就是你要的「yyyy-MM-dd'T'HH:mm:ss IST/EST」格式。
方案二:兼容旧版本的自定义映射
如果你的App需要支持API 26以下,又不想加第三方库,可以手动做时区ID到短缩写的映射,同时处理夏令时的情况:
// 获取当前时区 TimeZone defaultTz = TimeZone.getDefault(); String tzId = defaultTz.getID(); // 构建时区缩写映射表,按需添加更多时区 Map<String, String[]> tzAbbrMap = new HashMap<>(); // 数组第一个是标准时间缩写,第二个是夏令时缩写 tzAbbrMap.put("Asia/Kolkata", new String[]{"IST", "IST"}); // 印度时区没有夏令时 tzAbbrMap.put("America/New_York", new String[]{"EST", "EDT"}); // 格式化日期部分 SimpleDateFormat dateSdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); dateSdf.setTimeZone(defaultTz); String datePart = dateSdf.format(new Date()); // 获取对应的时区缩写 String[] abbrs = tzAbbrMap.get(tzId); String tzAbbr; if (abbrs != null) { // 判断是否处于夏令时 tzAbbr = defaultTz.inDaylightTime(new Date()) ? abbrs[1] : abbrs[0]; } else { // 没有映射的话,用系统提供的短名称作为 fallback tzAbbr = defaultTz.getDisplayName(false, TimeZone.SHORT); } // 拼接最终字符串 String finalTime = datePart + " " + tzAbbr; yourTextView.setText(finalTime);
这个办法虽然需要手动维护映射表,但能精准控制输出的缩写,适合对兼容性要求高的场景。
内容的提问来源于stack exchange,提问作者Anbarasu Chinna
相关产品推荐
相关产品推荐

