如何将字符串转换为带有时区的日期?

2024-03-30

我正在尝试转换我的String in Date+ 时区。 我从一个得到我的字符串DateTime变量(此处:xyz)。 我的代码:

String abc = xyz.toString("yyyy-MM-ddZZ");
java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyy-MM-ddXXX");
java.util.Date date = sdf.parse(abc);
System.out.println("Date: " + sdf.format(date));

Error:

格式无效:“2017-01-03+01:00”在“+01:00”处格式错误

如果我尝试SimpleDateFormat("yyyy-MM-dd");它可以工作,但没有时区(“+01:00”)


输入有一个日期 - 年、月、日 - 和一个偏移量 -与 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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将字符串转换为带有时区的日期? 的相关文章

随机推荐