输入有一个日期 - 年、月、日 - 和一个偏移量 -与 UTC 的差异 https://en.wikipedia.org/wiki/UTC_offset- 但要建立一个java.util.Date
,您还需要时间:小时、分钟、秒、秒的小数部分。
SimpleDateFormat
很糟糕,因为它做了一些“魔法”,将丢失的字段设置为默认值。另一个问题是X
模式并不适用于所有 Java 版本,而且文档也很糟糕。
您可以使用新的 Java 8 类,如所解释的。使用它们,您可以解析输入,选择用于时间字段的默认值并转换为java.util.Date
,如果这就是您需要的:
DateTimeFormatter fmt = new DateTimeFormatterBuilder().append(DateTimeFormatter.ISO_OFFSET_DATE)
// set hour to midnight
.parseDefaulting(ChronoField.HOUR_OF_DAY, 0).toFormatter();
OffsetDateTime odt = OffsetDateTime.parse("2017-01-03+01:00", fmt); // 2017-01-03T00:00+01:00
The OffsetDateTime
将时间设置为午夜,但您可以将其更改为您需要的任何值,同时使用SimpleDateFormat
这是不可能的,因为它使用内部默认值并且您无法控制它。
并且日期和偏移量已正确设置为输入字符串中的值。然后您可以转换为java.util.Date
如果你想:
Date date = Date.from(odt.toInstant());
如果需要,您还可以获得日期的各个“部分”:
// get just the date
LocalDate localDate = odt.toLocalDate(); // 2017-01-03
// get just the offset
ZoneOffset offset = odt.getOffset(); // +01:00
PS:偏移量+01:00
is not与时区相同。看到不同here https://stackoverflow.com/tags/timezone/info