Android中UTC转IST时间结果异常问题求助
嘿,先帮你理清一个关键的时间常识:印度标准时间(IST)是UTC+5:30,所以你给出的UTC时间2022-04-09 11:16:32,转成IST应该是2022-04-09 16:46:32,而不是你预期的2022-04-09 04:46:32——这个预期结果其实是UTC-6:30的时区,和IST完全相反,估计是你搞反了转换方向?不过先不管这个,先解决你代码输出不对的问题。
你现在得到的输出是2022/04/09 10:16:32,比UTC还早1小时,核心问题是:Java里三个字母的时区代码"IST"有歧义!它可能被解析成爱尔兰标准时间、以色列标准时间,而不是印度的。所以得用标准的时区标识符才行。另外,你用的SimpleDateFormat和Date是老API,线程不安全,处理时区容易踩坑,推荐用Java 8+的新API。
方案1:修复老代码(临时应急可用)
把时区ID改成印度时区的标准标识符"Asia/Kolkata",彻底避免歧义:
String date = dataItem.getTime().replaceAll("-","/"); try { DateFormat utcFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); utcFormat.setTimeZone(TimeZone.getTimeZone("UTC")); Date d = utcFormat.parse(date); DateFormat istFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); // 用标准时区ID替代模糊的IST istFormat.setTimeZone(TimeZone.getTimeZone("Asia/Kolkata")); holder.date.setText(istFormat.format(d)); } catch (ParseException e) { e.printStackTrace(); }
改完之后,UTC2022-04-09 11:16:32会正确输出成2022/04/09 16:46:32,这才是符合IST标准的时间。
方案2:使用Java 8+的java.time API(强烈推荐)
这套新API是线程安全的,时区处理逻辑更清晰,以后写日期时间代码都建议用它:
String utcTimeStr = dataItem.getTime(); // 原始格式是"2022-04-09 11:16:32" try { // 解析UTC时间字符串 DateTimeFormatter utcFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); LocalDateTime utcLocal = LocalDateTime.parse(utcTimeStr, utcFormatter); ZonedDateTime utcZoned = utcLocal.atZone(ZoneId.of("UTC")); // 转换为印度时区 ZonedDateTime istZoned = utcZoned.withZoneSameInstant(ZoneId.of("Asia/Kolkata")); // 格式化输出成你需要的格式 DateTimeFormatter istFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"); holder.date.setText(istFormatter.format(istZoned)); } catch (DateTimeParseException e) { e.printStackTrace(); }
这段代码运行后,同样会得到正确的IST时间2022/04/09 16:46:32。
额外说明
要是你真的需要得到2022-04-09 04:46:32这个结果,那你的需求应该是把IST时间转成UTC,而不是反过来,那就要调整解析和转换的顺序了。另外,记住以后永远用标准的时区标识符(比如Asia/Kolkata),别用三个字母的代码,避免踩歧义的坑。
内容的提问来源于stack exchange,提问作者user15660680

