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。使用它会更好。它可以工作,但这是一种复杂且容易出错的方式。