2016-07-05 138 views
0

所以我試圖將字符串轉換爲日期的iso格式。 這是我想要轉換的字符串「2016-07-05 02:14:35.0」 我希望以此格式使用iso 8601 「2016-07-05T02:14:35.0」將字符串轉換爲iso日期格式

我有這個迄今爲止

DateTimeFormatter format = DateTimeFormat.forPattern("YYYY-MM-DDTHH:mm:sszzz"); 
    new LocalDate(); 
    LocalDate newDate = LocalDate.parse(created,format); 
    created = newDate.toString(); 

但它給我這個例外

ERROR: Illegal pattern component: T; nested exception is java.lang.IllegalArgumentException: Illegal pattern component: T 

我跟着例子,我不知道我在做什麼錯在這裏。 任何幫助,將不勝感激。

+0

參見:https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html#ISO_INSTANT。如果這樣做不能幫助你改變模式到'YYYY-MM-DD'THH:mm:sszzz' – shachar

+0

想問一個問題嗎? ''2016-07-05 02:14:35.0「.replace(」「,」T「)' –

回答

4

首先,該值是LocalDateTime一個LocalDate。如果你想最終得到一個日期,我會先將它轉換爲LocalDateTime,然後取日期部分。

執行日期格式化和解析時,請務必仔細閱讀文檔。它看起來像你使用喬達時間(由於使用forPattern;如果你可以移動到Java 8將是有益的)。這意味着你應該閱讀DateTimeFormat docs

目前存在的問題與你的模式:

  • 你使用 'd' 而不是 'd';這意味着一年中某一天的
  • 你指定的「T」沒有引用它,它是不是在圖案反正
  • 你已經忽略你的價值
  • 的幾分之第二部分當值中沒有時區指示符時,您已指定'zz'。

這裏有一個工作示例:

import org.joda.time.*; 
import org.joda.time.format.*; 

public class Test { 
    public static void main(String[] args) { 
     String text = "2016-07-05 02:14:35.0"; 
     DateTimeFormatter format = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss.S"); 
     LocalDateTime localDateTime = LocalDateTime.parse(text, format); 
     System.out.println(localDateTime); 
    } 
} 

如果實際上想在中間與T解析值,你會使用的"yyyy-MM-dd'T'HH:mm:ss.S"模式 - 注意T如何再引述如此它的字面處理而不是格式說明符。

請注意,這是只是解析。它不是「將字符串轉換爲ISO日期格式」 - 它將字符串轉換爲LocalDateTime。如果您想以格式以ISO格式表示值,則需要使用DateTimeFormatter.print,並使用適當的格式。例如,您可能要轉換成的yyyy-MM-dd'T'HH:mm:ss.S「的格式:

import org.joda.time.*; 
import org.joda.time.format.*; 

public class Test { 
    public static void main(String[] args) { 
     String text = "2016-07-05 02:14:35.0"; 
     DateTimeFormatter parser = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss.S"); 
     LocalDateTime localDateTime = LocalDateTime.parse(text, parser); 
     DateTimeFormatter printer = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.S"); 
     String formatted = printer.print(localDateTime); 
     System.out.println(formatted); // Output 2016-07-05T02:14:35.0 
    } 
} 

上面的代碼將只處理一個單一的數字幾分之一秒。你可以使用.SSS而不是.S進行解析,但是你真的需要確定你想在不同的情況下輸出什麼(例如100毫秒,你想要.1還是.100?)。

+0

但是我想要的值沒有T。我認爲有一種方法可以自動放置T. – MNM

+0

@MNM:但你解析*的值不會。你沒有向我們展示你想要的結果。如果您需要轉換爲其他格式,則需要兩個不同的格式化程序。如果你提供預期的輸出,它會有所幫助... –

+0

我想要這樣的iso格式如此yyyy MM dd T HH mm ss T是我想放在那裏的東西。我不想拆分原始字符串,然後在其中添加一個T,然後將所有這些一起串接起來 – MNM

-3

使用以下格式

 String format = "yyyy-mm-dd hh:mm:ss" 

您使用了錯誤的格式轉換來轉換。使用T只是將日期與時間分開。 使用格式是這樣

 String = "yyyy-MM-dd'T'HH:mm:ss" 
+1

這也是錯誤的格式。 –

+0

「yyyy-MM-dd'T'HH:mm:ss」使用此 –

+1

這是*仍然*不正確 - 它不包括一秒的小數部分,您呈現的第一個模式仍然使用分鐘而不是幾個月,並且12小時,你提交的第二個片段甚至不會編譯。 –

1

你有一些錯誤,在你的代碼:

  • 模式應該是 'YYYY-MM-DD HH:MM:SS.SSS'。注意大寫 -
    和小寫。
  • 使用LocalDateTime獲取日期和時間。 LocalDate只保存日期。

校正的代碼:

String created = "2016-07-05 02:14:35.000"; 
DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"); 
LocalDateTime newDate = LocalDateTime.parse(created,format); 
created = newDate.toString(); 
System.out.println(created); 
相關問題