Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从偏移量为一位小时的字符串分析日期时间_Java_Date_Parsing_Timezone Offset_Datetime Parsing - Fatal编程技术网

Java 从偏移量为一位小时的字符串分析日期时间

Java 从偏移量为一位小时的字符串分析日期时间,java,date,parsing,timezone-offset,datetime-parsing,Java,Date,Parsing,Timezone Offset,Datetime Parsing,我需要用Java解析日期。我有字符串值2018-05-15 09:32:51.550082+3:00,我需要将其解析为日期时间。我试图解析到zoneDateTime,但在索引10处出错。尝试使用DateTimeFormatterparser'yyyy-MM-dd HH:MM:ss.SSSSSS Z'进行分析,但在索引26处出错。显然,无法解析我的UTC偏移量+3:00。我该怎么做呢?MadProgrammer的评论真的很有帮助。谢谢,伙计。 起初,我在时区中的3之前添加了0,我的字符串变成了“2

我需要用Java解析日期。我有字符串值
2018-05-15 09:32:51.550082+3:00
,我需要将其解析为日期时间。我试图解析到
zoneDateTime
,但在索引10处出错。尝试使用
DateTimeFormatter
parser'yyyy-MM-dd HH:MM:ss.SSSSSS Z'进行分析,但在索引26处出错。显然,无法解析我的UTC偏移量
+3:00
。我该怎么做呢?

MadProgrammer的评论真的很有帮助。谢谢,伙计。
起初,我在时区中的3之前添加了0,我的字符串变成了“2018-05-15 09:32:51.550082+03:00”,然后我使用DateTimeFormatter“yyy-MM-dd HH:MM:ss.n z”和现在的所有作品。感谢所有Java 9及更高版本允许:

    String dateTimeString = "2018-05-15 09:32:51.550082 +3:00";
    DateTimeFormatter formatter = new DateTimeFormatterBuilder()
            .appendPattern("uuuu-MM-dd HH:mm:ss.SSSSSS ")
            .appendOffset("+H:MM:ss", "+0:00")
            .toFormatter();
    OffsetDateTime dateTime = OffsetDateTime.parse(dateTimeString, formatter);
    System.out.println(dateTime);
输出:

2018-05-15T09:32:51.550082+03:00

对于Java 8或Three Ten Backport,您可能需要在解析日期时间字符串之前准备好它:

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss.SSSSSS XXX");
    dateTimeString 
            = dateTimeString.replaceFirst("([+-])(\\d(?::\\d\\d){0,2})$", "$10$2");
其余部分与之前一样,并给出相同的结果。
replaceFirst
调用在
+
3:00
之间插入一个
0
,但前提是小时数仅为一位数字。正则表达式很难阅读,因此您更喜欢Java9解决方案


正如在评论中已经讨论的,最难的部分是
+3:00
的偏移量。Java的内置格式化程序和可用于指定自己格式的格式模式字母都需要两位小时的偏移量。我使用的
DateTimeFormatterBuilder.appendOffset
方法允许指定有限数量的格式;Java 8中的9种不同格式;22在Java 9中。

wich语言?。。。或者在其源代码处获得正确的格式,这显然是首选方法。我永远无法理解程序在时间格式方面不只是遵守ISO8601。@OleV.V。好主意,但遗憾的是,该模式不允许只使用
H
,它必须是
HH
,否则您会遇到
IllegalArgumentException
@Ben您部分正确:它在Java 8中不起作用,但在Java 9和Java 10中起作用。这给了我2018-05-15T09:32:51.000550082+03:00。第二个小数点是三个位置偏右太远。否则可以。无论如何,感谢您分享您的解决方案。谢谢。无法在Java9上检查它,但在Java8上一切正常。很酷的回答