LocalDateTime API允许通过使用格式化程序中的键“ z”来添加TimeZone名称。添加此密钥时出现异常,不明白为什么。我正在寻找类似此示例的内容11:59:22 PM GMT,而不是“ **... UMT+2**”。
我的代码:
public class TimeZone
{
public static void main(String[] args)
{
LocalDateTime now = LocalDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("hh:mm:ss a z");
System.out.println(now.format(formatter));
}
}
Run Code Online (Sandbox Code Playgroud)
例外:
Exception in thread "main" java.time.DateTimeException: Unable to extract value: class java.time.LocalDateTime
at java.time.format.DateTimePrintContext.getValue(Unknown Source)
at java.time.format.DateTimeFormatterBuilder$ZoneTextPrinterParser.format(Unknown Source)
at java.time.format.DateTimeFormatterBuilder$CompositePrinterParser.format(Unknown Source)
at java.time.format.DateTimeFormatter.formatTo(Unknown Source)
at java.time.format.DateTimeFormatter.format(Unknown Source)
at java.time.LocalDateTime.format(Unknown Source)
at tz.TimeZone.main(TimeZone.java:12)
Run Code Online (Sandbox Code Playgroud)
这是DateTimeFormatter API部分:
All letters 'A' to 'Z' and 'a' to 'z' are reserved as pattern letters. The following pattern letters are defined:
Symbol Meaning Presentation Examples
------ ------- ------------ -------
G era text AD; Anno Domini; A
u year year 2004; 04
y year-of-era year 2004; 04
D day-of-year number 189
M/L month-of-year number/text 7; 07; Jul; July; J
d day-of-month number 10
Q/q quarter-of-year number/text 3; 03; Q3; 3rd quarter
Y week-based-year year 1996; 96
w week-of-week-based-year number 27
W week-of-month number 4
E day-of-week text Tue; Tuesday; T
e/c localized day-of-week number/text 2; 02; Tue; Tuesday; T
F week-of-month number 3
a am-pm-of-day text PM
h clock-hour-of-am-pm (1-12) number 12
K hour-of-am-pm (0-11) number 0
k clock-hour-of-am-pm (1-24) number 0
H hour-of-day (0-23) number 0
m minute-of-hour number 30
s second-of-minute number 55
S fraction-of-second fraction 978
A milli-of-day number 1234
n nano-of-second number 987654321
N nano-of-day number 1234000000
V time-zone ID zone-id America/Los_Angeles; Z; -08:30
z time-zone name zone-name Pacific Standard Time; PST
O localized zone-offset offset-O GMT+8; GMT+08:00; UTC-08:00;
X zone-offset 'Z' for zero offset-X Z; -08; -0830; -08:30; -083015; -08:30:15;
x zone-offset offset-x +0000; -08; -0830; -08:30; -083015; -08:30:15;
Z zone-offset offset-Z +0000; -0800; -08:00;
Run Code Online (Sandbox Code Playgroud)
谁能看到问题所在?
LocalDateTime有型的两个字段LocalDate和LocalTime。
LocalDate有田day,month和year。
LocalTime有田hour,minute,second,和nano。
在此没有给出时区。这是自然的,因为的javadoc LocalDateTime说:
没有时区的日期时间
因此,如果“本地”日期/时间值已经以UTC表示时间,并且您想要这样格式化,则可以有多种选择:
通过调用将更LocalDateTime改为:ZonedDateTimeatZone()
System.out.println(time.atZone(ZoneOffset.UTC)
.format(DateTimeFormatter.ofPattern("hh:mm:ss a z")));
Run Code Online (Sandbox Code Playgroud)通过调用withZone()以下命令在格式化程序中指定替代时区:
System.out.println(time.format(DateTimeFormatter.ofPattern("hh:mm:ss a z")
.withZone(ZoneOffset.UTC)));
Run Code Online (Sandbox Code Playgroud)用文字Z字符格式化:
System.out.println(time.format(DateTimeFormatter.ofPattern("hh:mm:ss a 'Z'")));
Run Code Online (Sandbox Code Playgroud)以上所有三个输出:
11:59:22 PM Z
现在,如果“本地”日期/时间确实在不同的时区中,则可以使用前两个时区中的任何一个,只需指定实际时区即可。
例如,如果时区为-04:00,请使用ZoneOffset.ofHours(-4),您将获得:
11:59:22 PM -04:00
或者,如果您在纽约,请使用ZoneId.of("America/New_York"),您将获得:
11:59:22 PM EDT
如果“本地”日期/时间是针对纽约的,但您希望格式化的文本为UTC,请同时使用两者,即
System.out.println(time.atZone(ZoneId.of("America/New_York"))
.format(DateTimeFormatter.ofPattern("hh:mm:ss a z")
.withZone(ZoneOffset.UTC)));
Run Code Online (Sandbox Code Playgroud)
这样,您就可以将时间转换为:
03:59:22 AM Z
本LocalDateTime类不支持时区; 你可以ZonedDateTime改用。
ZonedDateTime now = ZonedDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("hh:mm:ss a z");
System.out.println(now.format(formatter));
Run Code Online (Sandbox Code Playgroud)
这不再抛出异常并06:08:20 PM EDT为我打印,但时区会因您的位置而异。
| 归档时间: |
|
| 查看次数: |
8110 次 |
| 最近记录: |