使用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
相关产品推荐
相关产品推荐

