Java SimpleDataFormat对象更改时区而不添加/减去正确的小时数

Java SimpleDataFormat对象更改时区而不添加/减去正确的小时数,java,timezone,simpledateformat,Java,Timezone,Simpledateformat,我有一个字符串,表示UTC时区中的日期(因为我的数据库使用UTC)。我想将此字符串转换为带有SimpleDateFormat的日期。问题是将其转换为CEST时区中的日期,而不添加2小时的UTC和CEST分隔。代码如下: //This is a date in UTC String text = "2020-09-24T09:45:22.806Z"; //Here I define the correct format (The final Z means that it's

我有一个字符串,表示UTC时区中的日期(因为我的数据库使用UTC)。我想将此字符串转换为带有
SimpleDateFormat
的日期。问题是将其转换为CEST时区中的日期,而不添加2小时的UTC和CEST分隔。代码如下:

//This is a date in UTC
String text = "2020-09-24T09:45:22.806Z";
//Here I define the correct format (The final Z means that it's UTC)
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); 
//Then I parse it
Date date = sdf.parse(text);
//Then I print it
System.out.println(date);  
打印的结果是

Thu Sep 24 09:45:22 CEST 2020

为什么是塞斯特?我希望它保持UTC,但如果它必须成为CEST,则至少应在
日期格式中添加2小时

import java.text.ParseException;
导入java.text.simpleDataFormat;
导入java.util.Date;
导入java.util.TimeZone;
公共班机{
公共静态void main(字符串[]args)引发异常{
//这是UTC的日期
字符串text=“2020-09-24T09:45:22.806Z”;
//这里我定义了正确的格式(最后的Z表示它是UTC)
SimpleDataFormat sdf=新的SimpleDataFormat(“yyyy-MM-dd'HH:MM:ss.SSSX”);
设置时区(TimeZone.getTimeZone(“GMT”);
//然后我解析它
Date=sdf.parse(文本);
//然后我把它打印出来
系统输出打印项次(日期);
}
}

我还将
'Z'
替换为
X

“问题是将其转换为CEST时区中的日期”-不,它没有。没有“CEST时区中的日期”这样的东西,因为java.util.Date没有时区。(相反,
toString()
始终将
日期中表示的时间瞬间转换为系统默认时区。)至于为什么它没有按预期处理Z-您已将
'Z'
放入格式中,这意味着“精确字符Z”,对时区没有任何影响。如果您使用了
X
(未加引号),那么它会将其解析为ISO-8601时区偏移指示器。从根本上说,如果你可以改为使用java.time,你真的应该这样做。有一种更相关的方法可以将这篇文章标记为重复:我建议你不要使用
SimpleDateFormat
Date
。这些类设计得很糟糕,而且早已过时,其中前者尤其令人讨厌。相反,只需使用来自的
Instant