在以下代码中:
ZonedDateTime zdt = ZonedDateTime.now();
DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
String zdtString = FORMATTER.format(zdt);
System.out.println(zdtString);
您将看到它以yyyy-DD-mm格式打印出当前日期。由于这个问题发布于2021年7月17日,它打印了:
2021-07-17
但现在我想把日期改成不同的日期(比如1994-03-24(。
所以我尝试了:
DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
ZonedDateTime zdt2 = ZonedDateTime.parse("1994-03-24", FORMATTER);
String zdtString = FORMATTER.format(zdt2);
System.out.println(zdtString);
但随后我得到以下异常:
Exception in thread "main" java.time.format.DateTimeParseException: Text '1994-03-24' could not be parsed: Unable to obtain ZonedDateTime from TemporalAccessor: {},ISO resolved to 1994-03-24 of type java.time.format.Parsed
at java.time.format.DateTimeFormatter.createError(DateTimeFormatter.java:1920)
at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1855)
at java.time.ZonedDateTime.parse(ZonedDateTime.java:597)
at javaapplication5.JavaApplication5.main(JavaApplication5.java:48)
Caused by: java.time.DateTimeException: Unable to obtain ZonedDateTime from TemporalAccessor: {},ISO resolved to 1994-03-24 of type java.time.format.Parsed
at java.time.ZonedDateTime.from(ZonedDateTime.java:565)
at java.time.format.Parsed.query(Parsed.java:226)
at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851)
... 2 more
Caused by: java.time.DateTimeException: Unable to obtain ZoneId from TemporalAccessor: {},ISO resolved to 1994-03-24 of type java.time.format.Parsed
at java.time.ZoneId.from(ZoneId.java:466)
at java.time.ZonedDateTime.from(ZonedDateTime.java:553)
... 4 more
如何将自己的日期设置为当前日期以外的日期?
1994-03-24没有时区信息,因此在您提供时区信息之前,无法将其解析为ZonedDateTime
。此外,您还需要默认时间单位。
1994-03-24可以被直接解析为LocalDate
,因为现代的Date-Time API基于ISO8601,并且只要Date-Time字符串符合ISO8601标准,就不需要显式地使用DateTimeFormatter
对象。
import java.time.LocalDate;
public class Main {
public static void main(String[] args) {
System.out.println(LocalDate.parse("1994-03-24"));
}
}
输出:
1994-03-24
在线演示
使用默认时间单位和特定时区进行解析的演示:
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.temporal.ChronoField;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
DateTimeFormatter dtf = new DateTimeFormatterBuilder()
.appendPattern("u-M-d[ H]")
.parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
.toFormatter(Locale.ENGLISH)
.withZone(ZoneId.systemDefault());
ZonedDateTime zdt = ZonedDateTime.parse("1994-03-24", dtf);
System.out.println(zdt);
}
}
输出:
1994-03-24T00:00Z[Europe/London]
在线演示
注意:ZoneId.systemDefault()
返回JVM的ZoneId
。将其替换为适用的ZoneId
,例如ZoneId.of("America/New_York")
。另外,请注意方括号内的可选模式,该模式已默认为0。
从跟踪:日期时间了解有关现代日期时间API的更多信息。