如何在 java -simpledateformat 中将 UTC 日期转换为 PST 日期

How to convert the UTC date into PST date in java -simpledateformat

我正在尝试使用 simpledateformat 函数,但我不断收到错误“无法解析的日期:”

当前存储在string testtime=2021-09-14T21:15:09.863Z;//UTC时间中的时间 我想使用 T 和 Z 表示法将其转换为相同格式的 PST 时间;

Date date1=new SimpleDateFormat("yyyy-MM-dd'T'HH:mm.sss'Z'").parse(testtime); 

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm.sss'Z", Locale.US);

 dateFormat.setTimeZone(TimeZone.getTimeZone("PST"));

System.out.println("PRINTING the TIME in PST"+dateFormat.format(date1.getTime()));

这里缺少什么,请指教?

您的格式与您的输入不匹配,具体来说,HH:mm.sss21:15:09.863 不匹配。

将格式更改为 HH:mm:ss.SSS

然后开始使用较新的Date/Time APIs(即java.time

Java8+

String dateInString = "2021-09-14T21:15:09.863Z";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSX");

OffsetDateTime odt = OffsetDateTime.parse(dateInString, formatter);

ZoneId utcTZId = ZoneId.of("Etc/UTC");
ZonedDateTime utcDT = odt.atZoneSameInstant(utcTZId);
System.out.println(utcDT.format(DateTimeFormatter.ISO_ZONED_DATE_TIME));

ZoneId laTZId = ZoneId.of( "America/Los_Angeles" );
ZonedDateTime laDT = utcDT.withZoneSameInstant(laTZId);
System.out.println(laDT.format(DateTimeFormatter.ISO_ZONED_DATE_TIME));

打印...

2021-09-14T21:15:09.863Z[Etc/UTC]
2021-09-14T14:15:09.863-07:00[America/Los_Angeles]

读起来很有趣

使用java.time,你不需要格式化程序

我建议您使用 java.time,现代 Java 日期和时间 API,作为您的日期和时间工作。我假设 PST 指的是北美太平洋标准时间(America/Vancouver 或 America/Los_Angeles)。存在其他同样有效的解释。

    String testtime = "2021-09-14T21:15:09.863Z";
    
    Instant instant1 = Instant.parse(testtime);
    ZoneId desiredZone = ZoneId.of("America/Los_Angeles");
    ZonedDateTime pstDateTime = instant1.atZone(desiredZone);
    
    System.out.println("PRINTING the TIME in PST: " + pstDateTime);

输出:

PRINTING the TIME in PST: 2021-09-14T14:15:09.863-07:00[America/Los_Angeles]

糟糕,我们没有收到 PST。我们有太平洋夏令时或 PDT。想要在 9 月份进行 PST,我怀疑这是否有意义。当然,除非您指的是菲律宾标准时间或皮特凯恩标准时间。

ISO 8601: 您的字符串采用 ISO 8601 格式。 Instant 和 java.time 的另一个 类 解析和打印 ISO 8601 格式作为它们的默认格式,也就是说,我们没有指定任何格式化程序。所以我没有。 ZonedDateTime 的输出不是严格的 ISO 8601 格式。如果你想要,你可以使用内置 DateTimeFormatter.ISO_OFFSET_DATE_TIME:

格式化日期和时间
    System.out.println("PRINTING the TIME in PST: "
            + pstDateTime.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME));

PRINTING the TIME in PST: 2021-09-14T14:15:09.863-07:00

你错过了什么?

除了使用早已过时且麻烦的 类:

  • 切勿将 Z 硬编码为格式模式字符串中的文字。 In 表示 UTC,因此您需要将其解析并格式化为偏移量,否则在大多数情况下您会得到不正确的结果。
  • 特别是在 PST 时间之后打印 Z 是错误的。相反,我们希望 PST 的偏移量为 -08:00,PDT 的偏移量为 -07:00,如我上面的输出所示。
  • 正如其他人所指出的,两次格式模式字符串的时间部分都存在拼写错误:HH:mm.sss。两位数秒和三位数毫秒应该是HH:mm.ss.SSS。这个错字导致了您可能遇到的异常。
  • 不要依赖 PST 或其他三个字母的时区缩写。正如我所说,他们有多种解释。使用像 America/Vancouver 这样的时区 ID,因此采用 region/city 格式。

链接