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

使用JDK8将GMT转CST时遇时间一致问题求助

解决JDK8中GMT转CST时间始终一致的问题

我来帮你捋清楚这个问题哈——核心坑点在于Date对象的本质:它其实只是一个无时区的时间戳,记录的是从1970-01-01 00:00:00 GMT开始的毫秒数,不管你给Calendar设置什么时区,cal.getTime()返回的都是同一个时间戳,不会因为时区变化而改变。

你之前的代码只处理了GMT时区的格式化,没做CST的对应处理,而且误解了Calendar和Date的关系。下面是修正后的完整代码,能正确输出GMT和CST两个时区的时间:

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.TimeZone;

public class TimeZoneConvert {
    public static void main(String[] args) {
        // 获取当前时间的Calendar实例
        Calendar cal = Calendar.getInstance();
        
        // 定义两个时区:GMT和CST
        TimeZone gmtZone = TimeZone.getTimeZone("GMT");
        TimeZone cstZone = TimeZone.getTimeZone("CST");
        
        // 格式化工具:注意要为每个时区单独设置对应的TimeZone
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        
        // 格式化GMT时间
        sdf.setTimeZone(gmtZone);
        String gmtDateStr = sdf.format(cal.getTime());
        System.out.println("GMT time = " + gmtDateStr);
        
        // 格式化CST时间
        sdf.setTimeZone(cstZone);
        String cstDateStr = sdf.format(cal.getTime());
        System.out.println("CST time = " + cstDateStr);
    }
}

关键知识点解释:

  • Calendar.setTimeZone()是让Calendar内部按照指定时区来解析时间,但它的getTime()方法还是返回绝对时间戳(Date对象),和时区无关。
  • 时区的转换逻辑应该放在SimpleDateFormat上:通过给格式化器设置不同的时区,让同一个时间戳被解析为对应时区的本地时间字符串。
  • 额外提醒:CST是一个多义时区(可表示中国标准时间、美国中部时间等),如果要明确指定中国标准时间,建议用Asia/Shanghai作为时区ID,比直接用"CST"更准确,避免歧义。

内容的提问来源于stack exchange,提问作者Achaius

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:29:23