Android中如何将UTC毫秒时间转换为本地时区毫秒时间?
解决服务器毫秒时间戳转本地时区相关需求的问题
嘿,我来帮你理清楚这个问题~首先得纠正一个小误解:毫秒时间戳本身是与时区无关的绝对时间值,它代表的是从1970年1月1日00:00:00 UTC到目标时间点的毫秒数。所以服务器返回的1522034539973,不管在哪个时区,它对应的都是同一个绝对时间点——不存在“本地时区的毫秒时间戳”这种说法,因为时间戳本身不携带时区信息。
你之前用PrettyTime工具得到相对时间是正常的,因为这个工具的核心作用就是生成“X小时前”“Y天后”这类相对时间描述,根本不是用来处理时区转换或时间戳转换的,属于找错工具啦😅
如果你的真实需求是:把这个时间戳对应的UTC时间,转换为本地时区的日期时间表示(比如可读的字符串),或者获取本地时区下该时间点的日期字段,那可以用Java的java.time包(Java 8及以上推荐使用,比旧的Date/Calendar更可靠)来处理,下面给你两个实用的示例:
方法一:使用Java 8+推荐的java.time API
import java.time.Instant; import java.time.ZoneId; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; public class LocalTimeConversion { public static void main(String[] args) { long utcMillis = 1522034539973; // 将毫秒时间戳转为Instant(代表UTC时间点) Instant instant = Instant.ofEpochMilli(utcMillis); // 转换为本地时区的日期时间对象 ZonedDateTime localZonedTime = instant.atZone(ZoneId.systemDefault()); // 自定义格式输出本地时区时间(比如"2024-05-20 14:30:00.123") DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"); String localTimeStr = localZonedTime.format(formatter); System.out.println("本地时区格式化时间:" + localTimeStr); // 注意:如果把这个本地时区对象转回毫秒时间戳,结果还是原来的数值,因为是同一个绝对时间点 long convertedBackMillis = localZonedTime.toInstant().toEpochMilli(); System.out.println("转回的时间戳:" + convertedBackMillis); // 输出1522034539973 } }
方法二:使用旧版Date API(不推荐,但兼容老项目)
如果你维护的是Java 8之前的老项目,也可以用SimpleDateFormat来处理:
import java.util.Date; import java.util.TimeZone; import java.text.SimpleDateFormat; public class OldLocalTimeConversion { public static void main(String[] args) { long utcMillis = 1522034539973; Date date = new Date(utcMillis); // 设置格式化器为本地时区,自定义输出格式 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); sdf.setTimeZone(TimeZone.getDefault()); // 自动获取本地时区 String localTimeStr = sdf.format(date); System.out.println("本地时区格式化时间:" + localTimeStr); // 同样,date.getTime()返回的还是原时间戳 System.out.println("时间戳:" + date.getTime()); // 输出1522034539973 } }
总结一下:
- 时间戳是绝对的,没有时区属性,同一个时间点在任何时区的时间戳都相同;
- 如果你需要的是本地时区的可读时间字符串,用上面的格式化方法就可以;
PrettyTime是用来生成相对时间描述的,不适合做时区转换。
内容的提问来源于stack exchange,提问作者Constantin N.
相关产品推荐
相关产品推荐

