TL;博士
LocalDateTime.parse(
"2012-07-10 14:58:00.000000".replace(" " , "T")
)
微秒不適合
您正試圖擠壓用微秒(六個小數位數)只能夠毫秒分辨率的數據類型的值(三個十進制數字) 。那是不可能的。
而是使用具有足夠精細分辨率的數據類型。 java.times類使用納秒分辨率(九位十進制數字)。
不分區輸入不適合劃型
您正試圖把一個缺乏任何價值偏移從-UTC或時區爲數據類型(Date
),僅代表UTC值。因此,您要添加輸入不具備的信息(UTC偏移量)。
改爲使用適當的數據類型。具體來說,java.time.LocalDateTime
。
大小寫
其他答案和評論正確地解釋該格式的圖形碼區分大小寫。所以MM
和mm
有不同的效果。與Java的早期版本中捆綁
避免遺留類
麻煩的舊日期,時間類現在是傳統,通過內置到Java 8和後來的java.time類取代。
ISO 8601
您的輸入字符串幾乎符合ISO 8601標準格式。將中間的空格替換爲T
以完全符合要求。
java.time類在解析/生成字符串時默認使用標準格式。所以不需要指定格式化模式。
日期時間目標沒有「格式」
,我需要得到的日期對象是相同的格式。
不,日期 - 時間對象沒有「格式」。不要將日期 - 時間對象與單純的字符串混淆。字符串是對象的輸入和輸出。對象維護自己的日期 - 時間信息的內部表示,其細節與我們調用程序員無關。
java.time
您輸入缺少抵消 - 從 - UTC或麻煩我區的任何指示。所以我們解析爲一個缺乏這些概念的對象。
String input = "2012-07-10 14:58:00.000000".replace(" " , "T") ;
LocalDateTime ldt = LocalDateTime.parse(input) ;
生成字符串
,以產生表示您LocalDateTime
值的字符串:
- 呼叫
toString
得到在標準的ISO 8601格式的字符串。
- 使用
DateTimeFormatter
以自定義格式或自動本地化格式生成字符串。
搜索棧溢出更多的信息,因爲這些話題已經被覆蓋很多很多次。
ZonedDateTime
甲LocalDateTime
確實不表示在時間軸上的一個精確的點。
要確定實際時刻,請指定時區。例如印度加爾各答的中午比法國巴黎的中午早得多。沒有時區的中午可能會在大約26-27小時的任何時間點發生。
ZoneId z = ZoneId.of("Asia/Kolkata") ;
ZonedDateTime zdt = ldt.atZone(z) ;
關於java.time
的java.time框架是建立在Java 8和更高版本。這些類代替了日期時間類legacy,如java.util.Date
,Calendar
,& SimpleDateFormat
。
Joda-Time項目,現在在maintenance mode,建議遷移到java.time類。請參閱Oracle Tutorial。並搜索堆棧溢出了很多例子和解釋。規格是JSR 310。
您可以直接使用數據庫交換java.time對象。使用符合JDBC 4.2或更高版本的JDBC driver。無需字符串,不需要java.sql.*
類。
從何處獲取java.time類?
的ThreeTen-Extra項目與其他類擴展java.time。這個項目是未來可能增加java.time的一個試驗場。您可以在這裏找到一些有用的類,如Interval
,YearWeek
,YearQuarter
和more。
什麼是輸出「2012年1月10日14:58:00 EST」?你正在運行'System.out.println(thisDate)'嗎? – Gili
你使用'mm'幾分鐘和幾個月。您是如何期望SimpleDateFormat能夠在提供的字符串中區分幾分鐘和幾個月?請再次閱讀javadoc中的模式表:http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat。html – BalusC
@Gili:是的,我正在使用System.out.println(thisDate)。 –