java.time.format.DateTimeParseException:无法在索引0

时间:2018-07-04 10:41:25

标签: java date datetime

我正在尝试将String转换为时间戳。 我的字符串包含时间和时区('05:03:05.875 + 02:00'),但是出现以下错误:

错误

  

java.time.format.DateTimeParseException:文本'05:03:05.875 + 02:00'   无法在索引0处解析

代码

 String timewithZone= "05:03:05.875+02:00";
DateTimeFormatter formatter=DateTimeFormatter.ISO_OFFSET_DATE_TIME;
final ZonedDateTime a2=ZonedDateTime.parse(timewithZone,formatter);

4 个答案:

答案 0 :(得分:0)

失败,因为您的字符串没有与日期相关的标记。查看官方documentation中的示例。为了使其正常工作,您将需要添加年/月/日数据:

String timewithZone= "2018-07-3T05:03:05.875+02:00";

答案 1 :(得分:0)

您不能使用DateTimeFormatter.ISO_OFFSET_DATE_TIME,因为您的日期格式不符合该要求。

实际上,您甚至没有真实的日期,因为没有日期部分,只有时间部分。 您可以使用要接收的格式定义自己的SimpleDateFormat实例,但必须处理以下事实:没有日期信息,该数据实际上并没有那么有用。例如,该偏移量并不能真正告诉我们太多,因为它可能在某些地区的夏令时(DST)中或不在。这很大程度上取决于它的实际日期,而不仅仅是时间。

您必须找出这些数据的提供者对此的含义,因为现在您根本没有足够的信息来真正将其解析为正确的日期。

如果此数据仅表示一个简单的时间戳,例如说“我们的全球办公时间午餐时间为12:30”,则可以使用LocalTime类。那是少数这样的没有日期的时间字符串真正有用的情况之一。我暗中怀疑这不是您的情况。

答案 2 :(得分:0)

一种解决方法可能是

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm:ss.SSSz");
String str = "05:03:05.875+02:00";
LocalTime time = LocalTime.parse(str, formatter);
System.out.println(time);

我尝试了您所得到的格式的代码,

输出:

  

05:03:05.875

这是您要寻找的那个吗?

答案 3 :(得分:0)

    String timewithZone = "05:03:05.875+02:00";
    OffsetTime time = OffsetTime.parse(timewithZone);
    System.out.println("Parsed into " + time);

此输出

  

解析为05:03:05.875 + 02:00

您的字符串包含一个时间和一个偏移量,但没有日期。这很好,既不使用ISO_OFFSET_DATE_TIME也不使用ZonedDateTime,但使用的是OffsetTime,这是一个很少使用的类,我认为正是因为这个类有时在XML中发生。 >

还内置了ISO_OFFSET_TIME格式化程序,但是由于这是OffsetTime的默认格式,因此我们无需指定它。