Android中TimeZone.getDefault()返回错误时区,如何获取正确时区?
解决应用时区显示异常问题
1. 排查应用内的强制时区配置
先检查代码中是否存在硬编码强制设置UTC时区的逻辑,比如:
TimeZone.setDefault(TimeZone.getTimeZone("UTC")); Locale.setDefault(Locale.ROOT);
如果有这类代码,移除后应用会自动使用系统默认时区。
2. 正确获取带时区的时间对象
避免直接使用LocalDateTime.now()(其依赖系统时区上下文,若被篡改会失效),显式指定系统默认时区来获取时间:
// 获取系统默认时区 ZoneId systemZone = ZoneId.systemDefault(); // 获取带时区的当前时间 ZonedDateTime currentTime = ZonedDateTime.now(systemZone); // 输出示例:2022-09-14T10:46:22.849+03:00[Asia/Istanbul] System.out.println(currentTime);
3. 验证系统时区的识别状态
若上述操作后仍显示UTC,可通过以下代码确认应用是否正确读取系统时区:
ZoneId zoneId = ZoneId.systemDefault(); System.out.println("系统时区ID: " + zoneId.getId()); System.out.println("时区偏移量: " + zoneId.getRules().getOffset(Instant.now()));
如果输出依旧是UTC,尝试重启应用,或检查定制ROM是否限制了应用读取系统时区的权限。
4. 时间戳的正确认知与格式化
System.currentTimeMillis()返回的是UTC时间戳,本身与时区无关(手机10:46 UTC+3对应UTC 07:46,时间戳值是正确的)。若要按手机时区展示时间,需指定时区格式化:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); sdf.setTimeZone(TimeZone.getDefault()); System.out.println(sdf.format(new Date(System.currentTimeMillis())));
内容的提问来源于stack exchange,提问作者Murat Aktay
相关产品推荐
相关产品推荐

