You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

时区转换求助:如何将服务器UTC时间戳转为本地时间?

解决服务器UTC时间戳转本地CST时间的问题

嘿,我看你遇到了把服务器返回的UTC时间转成本地CST时间的问题,咱们来捋清楚问题出在哪,再给出正确的解法!

你的代码里直接用parseLocalTime提取时间,这其实只拿了字符串里的时分秒数值,完全没处理时区——服务器返回的2018-04-05T16:14:19.130Z是UTC时区的时间(末尾的Z就是UTC的标记),而你要的是CST(中国标准时间,GMT+8)的本地时间,所以直接提取肯定不对啦。

正确实现思路(基于你用的Joda Time库)

  1. 先把完整的日期时间字符串解析成带时区的DateTime对象,让程序知道这是UTC时间
  2. 将这个UTC时间转换到目标时区(推荐用Asia/Shanghai这个完整时区ID,避免CST缩写的歧义,毕竟它还可能代表美国中部时间)
  3. 最后再提取本地时间或者格式化输出

代码示例

// 注意这里不要给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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:10:20