Z 与 z 不同。
DateTimeFormatter 将前者评估为 zone-offset,而将后者评估为 time-zone name。
另一个例子可以是M,它用于月份,m,它用于分钟数。。 p>
日期、时间、时区等组件的符号区分大小写。查看DateTimeFormatter 了解有关这些符号的更多信息。
快速演示:
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
public class Main {
public static void main(String[] args) {
ZonedDateTime odt = ZonedDateTime.now(ZoneId.of("Asia/Calcutta"));
System.out.println(DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ssZ").format(odt));
System.out.println(DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ssz").format(odt));
}
}
输出:
2020-12-22T00:14:44+0530
2020-12-22T00:14:44IST
时区偏移量与时区不同。时区的 ID 格式为 Continent/City,例如Asia/Calcutta 而区域偏移量以小时和分钟表示,它表明某个地点的日期和时间与 UTC 日期和时间的偏移量是多少小时和分钟。因此,许多时区 ID 可以具有相同的时区偏移量。换句话说,可以从时区 ID 导出区域偏移量,但反过来是不可能的,例如在下面的演示中,OffsetDateTime 将能够确定时区 ID 与 Asia/Calcutta 的时区偏移量,但尝试使用 z 获取时区名称(如上例)将失败。
import java.time.OffsetDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
public class Main {
public static void main(String[] args) {
OffsetDateTime odt = OffsetDateTime.now(ZoneId.of("Asia/Calcutta"));
System.out.println(DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ssZ").format(odt));
System.out.println(DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ssz").format(odt));
}
}
输出:
2020-12-22T00:30:40+0530
Exception in thread "main" java.time.DateTimeException: Unable to extract ZoneId from temporal 2020-12-22T00:30:40.865087+05:30
at java.base/java.time.format.DateTimePrintContext.getValue(DateTimePrintContext.java:289)
at java.base/java.time.format.DateTimeFormatterBuilder$ZoneTextPrinterParser.format(DateTimeFormatterBuilder.java:4072)
at java.base/java.time.format.DateTimeFormatterBuilder$CompositePrinterParser.format(DateTimeFormatterBuilder.java:2341)
at java.base/java.time.format.DateTimeFormatter.formatTo(DateTimeFormatter.java:1843)
at java.base/java.time.format.DateTimeFormatter.format(DateTimeFormatter.java:1817)
at Main.main(Main.java:9)
我使用“OffsetDateTime.parse()”(在 java 中)来解析这种格式。一世
能够通过传递“t”(而不是“T”)和“z”来解析日期时间
(而不是“Z”)。
我已经解释了Z 和z。让我们关注T 和t。如果你仔细观察,你会发现我在T 周围使用了单引号,即'T',这使它成为在日期时间字符串中使用的字符串文字。这意味着它可以是任何东西,例如't' 或 'Foo' 或 'Bar'。只要DateTimeFormatter 中的文字与日期时间字符串中的文字大小写相同,它就可以正常工作。我在下面的演示中展示了它:
import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;
public class Main {
public static void main(String[] args) {
String strDateTime = "2020-12-22T00:45:50+05:30";
// The given string is already in the format which is use by OffsetDateTime for
// parsing without a DateTimeFormatter
OffsetDateTime odt = OffsetDateTime.parse(strDateTime);
// Let's try to parse it using different types of DateTimeFormatter instances
System.out.println(OffsetDateTime.parse(strDateTime, DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ssXXX")));
//The following line will fail as the literal does not match case-wise
//System.out.println(OffsetDateTime.parse(strDateTime, DateTimeFormatter.ofPattern("uuuu-MM-dd't'HH:mm:ssXXX")));
strDateTime = "2020-12-22t00:45:50+05:30";// Now, DateTimeFormatter with 't' will work successfully
System.out.println(OffsetDateTime.parse(strDateTime, DateTimeFormatter.ofPattern("uuuu-MM-dd't'HH:mm:ssXXX")));
}
}
输出:
2020-12-22T00:45:50+05:30
2020-12-22T00:45:50+05:30
通过 Trail: Date Time 了解有关现代日期时间 API 的更多信息。