如何在 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.sss
与 21: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 格式。
链接
- Oracle tutorial: Date Time 解释如何使用 java.time.
- Wikipedia article: ISO 8601
我正在尝试使用 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.sss
与 21: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 格式。
链接
- Oracle tutorial: Date Time 解释如何使用 java.time.
- Wikipedia article: ISO 8601