Java-需要将日期字符串更改为日期,但应用偏移量

Java-需要将日期字符串更改为日期,但应用偏移量,java,android,time,offset,Java,Android,Time,Offset,我有一个日期字符串,如下所示: "2018-04-12T21:25:28.0000000-0700" String dateString = "2018-04-12T21:25:28.0000000-0700"; DateTimeFormatter fmt = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSSSSSZ"); LocalDateTime dateTime = OffsetDateTime.parse(dateStri

我有一个日期字符串,如下所示:

"2018-04-12T21:25:28.0000000-0700"
String dateString = "2018-04-12T21:25:28.0000000-0700";

DateTimeFormatter fmt = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSSSSSZ");
LocalDateTime dateTime = OffsetDateTime.parse(dateString, fmt)
                                       .atZoneSameInstant(ZoneOffset.UTC)
                                       .toLocalDateTime();

System.out.println(dateTime.format(DateTimeFormatter.ofPattern("uuuu-MM-dd hh:mm:ss a")));
我需要将其转换为日期对象,但它需要应用-7偏移量,以便时间

2:25:28 pm 
而不是

9:25:28 pm
有没有一个简单的方法可以做到这一点

我试过:

String dateString = "2018-04-12T21:25:28.0000000-0700";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
Date date = sdf.parse(dateString);
但我得到:

date = 12/04/2018 9:25:28 PM

not 
date = 12/04/2018 2:25:28 PM

非常感谢你的帮助

将日期字符串解析为两个字符串,即日期和偏移量,然后从日期中减去偏移量。

看起来您没有将时区设置为SimpleDataFormat。我建议将格林尼治标准时间设为时区-

这将返回您的预期值:2018年4月12日星期四14:25:28 PDT

如a中所述,您需要加上7小时以获得UTC/GMT时间,而不是减去7小时。显示的偏移量是已应用于时间的偏移量,而不是用于获取UTC时间的偏移量。在偏移量-7小时处读取

使用Java 8时间API,您可以这样做:

"2018-04-12T21:25:28.0000000-0700"
String dateString = "2018-04-12T21:25:28.0000000-0700";

DateTimeFormatter fmt = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSSSSSZ");
LocalDateTime dateTime = OffsetDateTime.parse(dateString, fmt)
                                       .atZoneSameInstant(ZoneOffset.UTC)
                                       .toLocalDateTime();

System.out.println(dateTime.format(DateTimeFormatter.ofPattern("uuuu-MM-dd hh:mm:ss a")));
输出

2018-04-13 04:25:28上午

java.time 您正在使用非常麻烦的旧日期时间类,这些类在几年前被java.time类取代

定义与输入匹配的格式模式

String input = "2018-04-12T21:25:28.0000000-0700";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "uuuu-MM-dd'T'HH:mm:ss.SSSSSSSX"  );
将输入解析为OffsetDateTime,因为您的输入与UTC有偏移量,但没有时区

OffsetDateTime odt = OffsetDateTime.parse( input , formatter );
odt.toString:2018-04-12T21:25:28-07:00

了解UTC的偏移量 您要求“应用-7偏移”。您可能误解了输入字符串所用格式的含义。零下七个偏移量-0700格式更好,冒号为-07:00,表示显示的日期和时间比UTC晚七小时。该偏移量由多个时区使用,如美国/洛杉矶。无需应用任何内容,因为已应用偏移量。该字符串表示2018年4月12日晚9点在北美西海岸

也许您真正想要的是UTC所看到的同一时刻。在这种情况下,你需要加七个小时,而不是减。不要将ISO 8601字符串作为等式读取。负数表示在UTC之后,因此添加相同的小时数分钟以到达UTC

此外,你根本不需要做任何数学题。对于UTC值,请提取一个瞬间。该类表示时间线上的某个时刻,分辨率高达9位小数

Instant instant = odt.toInstant() ;
instant.toString:2018-04-13T04:25:28Z

ISO 8601字符串末尾的Z是Zulu的缩写,表示UTC。因此,我们可以看到UTC第二天的上午4点与北美西海岸的晚上9点同时发生。换句话说,在冰岛、亚速尔群岛和其他地方,洛杉矶的晚上9点是下一天的上午4点,与UTC的偏移量为0小时

关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

您可以直接与数据库交换java.time对象。使用兼容的或更高版本。不需要字符串,也不需要java.sql.*类

从哪里获得java.time类

然后 内置的。 标准JavaAPI的一部分,带有捆绑实现。 Java9添加了一些次要功能和修复。 和 大部分java.time功能都在中向后移植到Java6和Java7。 更高版本的Android捆绑包实现了java.time类。
对于早期的Android仅供参考,麻烦的旧日期时间类,如,和java.text.simpleDataFormat,现在被java 8和更高版本中内置的类所取代。请参阅。您给定的格式模式与问题中的数据不匹配。2018年4月12日星期四14:25:28 PDT不是正确的结果。是的,你的代码在我运行它时给出了这个结果,所以它是不正确的,-0700更好的格式为-07:00表示一天中的时间和显示的日期代表UTC落后7小时的时刻,如美国/洛杉矶时区。所以减去七个小时毫无意义。如果你想看到与UTC相同的时刻,添加七个小时,而不是减去。作为一个旁白,考虑扔掉长期过时和臭名昭著的简单SimeDead格式和朋友,并添加到Android项目中,以便使用JavaTime-现代java日期和时间API。使用它会更好。它可以工作,但这是一种复杂且容易出错的方式。