2016-03-09 143 views
4

我得到的日期時間值java.time.format.DateTimeParseException:文本無法在指數解析21

created_at '2012-02-22T02:06:58.147Z' 
Read-only. The time at which this task was created. 

這是由體位API給出

我使用Java 8解析日期如下

import java.time.*; 
import java.time.format.*; 

public class Times { 

    public static void main(String[] args) { 
    final String dateTime = "2012-02-22T02:06:58.147Z"; 
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'hh:mm:ss.SX"); 


    final ZonedDateTime parsed = ZonedDateTime.parse(dateTime, formatter); 
    System.out.println(parsed); 
    } 
} 

時候,我跑,我得到了以下錯誤

Exception in thread "main" java.time.format.DateTimeParseException: Text '2012-02-22T02:06:58.147Z' could not be parsed at index 21 
    at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1947) 
    at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1849) 
    at java.time.ZonedDateTime.parse(ZonedDateTime.java:597) 
    at Times.main(Times.java:11) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140) 

什麼不是在這裏?

+0

您可能想更改爲「yyyy-M-d」來處理單位數的月份和日期。 – paiego

回答

4

默認解析器可以解析您的輸入。所以你不需要一個自定義的格式化程序和

String dateTime = "2012-02-22T02:06:58.147Z"; 
ZonedDateTime d = ZonedDateTime.parse(dateTime); 

按預期工作。

0

以下爲我工作

import java.time.*; 
import java.time.format.*; 

public class Times { 

    public static void main(String[] args) { 
    final String dateTime = "2012-02-22T02:06:58.147Z"; 
    DateTimeFormatter formatter = DateTimeFormatter.ISO_INSTANT; 
    final ZonedDateTime parsed = ZonedDateTime.parse(dateTime, formatter.withZone(ZoneId.of("UTC"))); 
    System.out.println(parsed.toLocalDateTime()); 
    } 
} 

,給了我輸出

2012-02-22T02:06:58.147 
2

你原來的問題是錯誤的圖案符號「H」,這代表着時鐘小時(範圍1-12) 。在這種情況下,am-pm信息丟失。更好的是,使用the pattern symbol "H"代替(0-23範圍內的一天中的小時)。所以模式應該寧可一直喜歡:

UUUU-MM-dd'T'HH:MM:ss.SSSX(最好的模式也適用於嚴格模式)

8

如果輸入總有一個時區「祖魯」( 「Z」= UTC),那麼你可以使用DateTimeFormatter.ISO_INSTANT(隱含的):

final Instant parsed = Instant.parse(dateTime); 

如果時區發生變化,並且形式爲 「+01:00」 或「+01:00:00 「(當不是」Z「)時,則可以使用DateTimeFormatter.ISO_OFFSET_DATE_TIME

DateTimeFormatter formatter = DateTimeFormatter.ISO_OFFSET_DATE_TIME; 
final ZonedDateTime parsed = ZonedDateTime.parse(dateTime, formatter); 

如果不是這種情況,可以按照構建DateTimeFormatter.ISO_OFFSET_DATE_TIME的相同方式構建DateTimeFormatter


您當前的模式有幾個問題:不使用嚴格模式(ResolverStyle.STRICT

  • ;
  • 使用yyyy而不是uuuuyyyy將無法​​在嚴格模式下工作);
  • 使用12小時hh而不是24小時HH;
  • 僅使用一位數字S爲小數秒,但輸入有三位。
+0

有關嚴格或寬鬆模式的良好觀察結果!我最初在我的回答中採用寬鬆模式。有關信息:在寬鬆模式下,只有一個S符號而不是「.SSS」的模式可以使用。 –