Java 在时区偏移量保持不变的情况下分析到日期的字符串

Java 在时区偏移量保持不变的情况下分析到日期的字符串,java,Java,我们有一个客户以字符串格式向我们发送日期,如“2017-06-14T04:00:00-08:00”。在使用它之前,我们需要将其转换为JAVA日期类型 我们以这种方式进行分析: SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX"); dateParsedFromString = formatter.parse("2017-06-14T04:00:00-08:00"); 但是,在这个解析之后,我

我们有一个客户以字符串格式向我们发送日期,如“2017-06-14T04:00:00-08:00”。在使用它之前,我们需要将其转换为JAVA日期类型

我们以这种方式进行分析:

SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX"); 
dateParsedFromString = formatter.parse("2017-06-14T04:00:00-08:00");
但是,在这个解析之后,我们将丢失偏移量。当我们将其转换回字符串时,我们看到了值:

2017-06-14T08:00:00-04:00

如何在不更改偏移量的情况下将JAVA中的
字符串
转换为
日期

不存储时区信息

要保留时区,请使用或(Java 8+)

因为您的日期字符串是,所以您甚至不需要指定日期格式

ZonedDateTime zdt = ZonedDateTime.parse("2017-06-14T04:00:00-08:00");
System.out.println(zdt); // prints: 2017-06-14T04:00-08:00
对于Java 8之前的版本,请使用:

ThreeTen Backport为JavaSE6和JavaSE7提供了JavaSE8日期时间类的一个Backport


可能是@MarioSantini的重复。phyton的答案怎么可能是Java问题的重复?@Jens你是对的,很抱歉我错过了链接,看看这里是一个Java anser,无法标记,因为它不是可接受的答案。@Jens不,当我打印它时没有更改回去,我得到了错误的时间“2017年6月14日星期三美国东部夏令时08:00:00“。我在将其更改为字符串后给出了输出,因为它更好地解释了我的要求。虽然
ZonedDateTime
技术上可行,
OffsetDateTime
是合适的。时区是特定区域使用的偏移量更改历史。@BasilBourque使用
ZoneDateTime
是完全有效的,因为
-08:00
是有效的时区。时区是区域偏移量的超集,或者更确切地说,是
ZoneId
的子类(限制)。那么为什么我们有
OffsetDateTime
类呢?而且,不,
-08:00
不是时区<代码>美国/洛杉矶是一个时区。该区域在一年中的某一部分偏移量为
-08:00
,在另一部分偏移量为
-07:00
。偏移量随时间的变化、过去的历史记录、当前偏移量以及未来计划的偏移量变化,一个区域的偏移量集合就是一个时区。因此,您在回答中使用的
ZoneDateTime
会产生误导、混淆,并且不适合输入数据。否则,如果您删除ZoneDateTime,这是一个很好的答案。@Andreas感谢您的解决方案,但不幸的是,我们没有使用JAVA8@BasilBourque仅偏移的ZoneId是完全有效的ZoneId,因此使用
ZoneDateTime
也完全有效。当然,您可以通过使用
OffsetDateTime
将其限制为仅偏移,如果您知道输入将仅为偏移,这可能是一个好主意,但使用
zoneDateTime
并不是无效或误导的答案,并且输入完全适合
zoneDateTime
。即使有
zoneDateTime
,这仍然是一个很好/有用的答案。
OffsetDateTime odt = OffsetDateTime.parse("2017-06-14T04:00:00-08:00");
System.out.println(odt); // prints: 2017-06-14T04:00-08:00