时区转换求助:如何将服务器UTC时间戳转为本地时间?
解决服务器UTC时间戳转本地CST时间的问题
嘿,我看你遇到了把服务器返回的UTC时间转成本地CST时间的问题,咱们来捋清楚问题出在哪,再给出正确的解法!
你的代码里直接用parseLocalTime提取时间,这其实只拿了字符串里的时分秒数值,完全没处理时区——服务器返回的2018-04-05T16:14:19.130Z是UTC时区的时间(末尾的Z就是UTC的标记),而你要的是CST(中国标准时间,GMT+8)的本地时间,所以直接提取肯定不对啦。
正确实现思路(基于你用的Joda Time库)
- 先把完整的日期时间字符串解析成带时区的
DateTime对象,让程序知道这是UTC时间 - 将这个UTC时间转换到目标时区(推荐用
Asia/Shanghai这个完整时区ID,避免CST缩写的歧义,毕竟它还可能代表美国中部时间) - 最后再提取本地时间或者格式化输出
代码示例
// 注意这里不要给Z加单引号,不然会被当成普通字符,无法识别时区 final DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); // 解析出UTC时区的日期时间 DateTime utcDateTime = formatter.parseDateTime("2018-04-05T16:14:19.130Z"); // 指定目标时区为中国标准时间(Asia/Shanghai) DateTimeZone cstZone = DateTimeZone.forID("Asia/Shanghai"); // 转换时区 DateTime cstDateTime = utcDateTime.withZone(cstZone); // 获取本地时间,这时候就是你要的11:14啦 LocalTime localTime = cstDateTime.toLocalTime(); Timber.i(localTime.toString()); // 输出:11:14:19.130 // 如果需要输出完整的日期时间,也可以格式化一下 String formattedTime = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss.SSS").print(cstDateTime); Timber.i(formattedTime); // 输出:2018-04-05 11:14:19.130
额外小提示
- 为什么不能给
Z加单引号?因为Z是时区标识符,加了单引号后,格式化器会把它当成普通的字母Z,而不会解析为时区信息,这就导致程序不知道原时间是UTC,自然没法转换。 - 尽量用完整的时区ID(比如
Asia/Shanghai)而不是CST缩写,避免不同场景下的歧义。
如果你的项目已经用Java 8及以上的java.time API(现在更推荐这个),也可以试试下面的代码:
import java.time.LocalTime; import java.time.OffsetDateTime; import java.time.ZoneId; // 直接解析带UTC偏移的时间 OffsetDateTime utcDateTime = OffsetDateTime.parse("2018-04-05T16:14:19.130Z"); // 转换到上海时区并提取本地时间 LocalTime cstLocalTime = utcDateTime.atZoneSameInstant(ZoneId.of("Asia/Shanghai")).toLocalTime(); System.out.println(cstLocalTime); // 输出:11:14:19.130
内容的提问来源于stack exchange,提问作者nullbyte
相关产品推荐
相关产品推荐

