将 PST 时间转换为 GMT

Pau*_*art 0 java timezone

我正在尝试在java中将pst时间戳转换为gmt

我有一个带有时间戳的字符串2021-03-23T22:00:00.669-07:00。我将如何处理该字符串并将其转换为 GMT 时间戳?

2021-03-24T05:03:00.669Z
Run Code Online (Sandbox Code Playgroud)

我做了一些我尝试过的事情,但还没有去过任何地方

//Date date = new Date(str);
      
String s = str;
DateFormat pstFormat = new SimpleDateFormat();
DateFormat gmtFormat = new SimpleDateFormat();
TimeZone gmtTime = TimeZone.getTimeZone("GMT");
TimeZone pstTime = TimeZone.getTimeZone("PST");
      
pstFormat.setTimeZone(gmtTime);
gmtFormat.setTimeZone(pstTime);
System.out.println("GMT Time: " + pstFormat.format(s));
System.out.println("PST Time: " + gmtFormat.format(s));
Run Code Online (Sandbox Code Playgroud)

结果java.lang.IllegalArgumentException: Cannot format given Object as a Date在这一行:

System.out.println("GMT Time: " + pstFormat.format(s));
Run Code Online (Sandbox Code Playgroud)

Bas*_*que 5

太长了;博士

OffsetDateTime
.parse( "2021-03-23T22:00:00.669-07:00" ) 
.toInstant()
.toString()
Run Code Online (Sandbox Code Playgroud)

细节

永远不要使用那些糟糕的日期时间类SimpleDateFormatDateTimeZone。几年前被 JSR 310 中定义的现代java.time类取代。

您的输入与 UTC 的偏移量为负七小时。因此解析为OffsetDateTime.

OffsetDateTime odt = OffsetDateTime.parse( "2021-03-23T22:00:00.669-07:00" ) ;
Instant instant = odt.toInstant() ;
String output = instant.toString() ;
Run Code Online (Sandbox Code Playgroud)

您的输入和所需输出均符合 ISO 8601 标准。java.time类在解析/生成文本时默认使用这些标准格式因此无需指定格式模式。

切勿使用 2-4 个字母的伪区域,例如 PST。使用格式为的实时时区名称,Continent/Region例如America/Los_Angeles. 此外,与您的第一句话相反,您的输入并不代表特定时区的时刻。许多时区此时可能共享 -07:00 的偏移量,因此无法知道您的数据源想要哪个时区。