我从源系统获得以下字符串格式的日期时间内容和偏移时间值。
2019-08-07T19:20-5:00使用偏移值将其转换为日期时间的位置。我试了下,但没有得到预期的结果。
OffsetDateTime sourceDateTime = OffsetDateTime.parse("2019-08-07T19:20-5:00");
System.out.println(sourceDateTime.getOffset());输出
Exception in thread "main" java.time.format.DateTimeParseException: Text '2019-08-07T19:20-5:00' could not be parsed at index 16
at java.base/java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:2046)
at java.base/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1948)
at java.base/java.time.OffsetDateTime.parse(OffsetDateTime.java:402)
at java.base/java.time.OffsetDateTime.parse(OffsetDateTime.java:387)
at com.example.demo.Testfile.main(Testfile.java:19)有什么简单的方法可以达到预期的输出吗?
注意:我使用的是Java 8
发布于 2022-07-04 07:37:19
如果没有ISO String…,则不能使用ISO格式化程序。问题似乎是您得到的偏移量的格式,它是+H:mm,而不是在ISO标准中使用的格式,即+HH:mm。一句话:它不考虑个位数的小时数.
您必须针对这种情况构建一个特定的DateTimeFormatter。
不幸的是,Java 8不支持使用偏移量小时数的单数表示的模式,但是如果您可以使用Java 9或更高版本,则可以定义考虑以+H:mm格式的区域偏移的DateTimeFormatter。
Java 9+
public static void main(String[] args) {
DateTimeFormatter dtf = new DateTimeFormatterBuilder()
.append(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
.appendOffset("+H:mm", "UTC")
.toFormatter(Locale.ENGLISH);
OffsetDateTime sourceDateTime = OffsetDateTime.parse("2019-08-07T19:20-5:00", dtf);
System.out.println(sourceDateTime.getOffset());
}这将对LocalDateTime使用ISO格式化程序,并附加用于解析偏移量的特定模式。
诚然,我不确定"UTC"是否是一个好的(硬编码的)选择,作为默认偏移量,以防String不包含任何偏移量。
此代码的输出:
-05:00Java 8-> String操作
public static void main(String[] args) {
// provide some variants of input
List<String> variants = List.of(
"2019-08-07T19:20-5:00", "2019-08-07T19:20+5:00",
"2019-08-07T19:20-05:00", "2019-08-07T19:20+05:00"
);
// handle offset extraction via String manipulation for each variant
variants.forEach(variant -> {
String parseable = variant;
/*
* This assumes an offset always has a sign and
* a colon that separates hours and minutes.
*
* Get all their indexes in order to find the offset
*/
int lastIndexOfColon = variant.lastIndexOf(':');
int lastIndexOfMinus = variant.lastIndexOf('-');
int lastIndexOfPlus = variant.lastIndexOf('+');
/*
* Decide which sign actually leads the offset
* (it's either a plus or the very last minus).
* In either case insert a leading zero if the amount of digits/chars
* between '-'/'+' and ':' is 1, otherwise don't do anything…
*/
if (lastIndexOfMinus > lastIndexOfPlus && lastIndexOfMinus + 2 == lastIndexOfColon) {
parseable = variant.substring(0, lastIndexOfMinus + 1)
+ '0'
+ variant.substring(lastIndexOfMinus + 1);
} else if (lastIndexOfPlus + 2 == lastIndexOfColon) {
parseable = variant.substring(0, lastIndexOfPlus + 1)
+ '0'
+ variant.substring(lastIndexOfPlus + 1);
}
// then parse the manipulated String
OffsetDateTime odt = OffsetDateTime.parse(parseable);
// get the offset
ZoneOffset zoneOffset = odt.getOffset();
// and print some result
String msg = String.format("%s has an offset of %s", variant, zoneOffset);
System.out.println(msg);
});
}此示例的输出为
2019-08-07T19:20-5:00 has an offset of -05:00
2019-08-07T19:20+5:00 has an offset of +05:00
2019-08-07T19:20-05:00 has an offset of -05:00
2019-08-07T19:20+05:00 has an offset of +05:00另一种方法可以是将偏移部分从日期和时间中分离出来,并使用解析后的值左、右到最后一个冒号创建一个ZoneOffset.of(int, int)。解析日期-时间部分并随后应用偏移量也可能导致所需的结果。
发布于 2022-07-04 07:18:44
这是正确的代码
OffsetDateTime sourceDateTime = OffsetDateTime.parse("2019-08-07T19:20-05:00");
System.out.println(sourceDateTime.getOffset());https://stackoverflow.com/questions/72852932
复制相似问题