2012-12-17 57 views
17

我需要將包含日期的字符串轉換爲日期對象。字符串的格式爲「yyyy-mm-dd HH:mm:ss.SSSSSS」,我希望日期對象的格式相同。Java字符串日期格式「yyyy-mm-dd HH:mm:ss」的對象

例如我有一個字符串「2012-07-10 14:58:00.000000」,我需要生成的日期對象是相同的格式。

我已經嘗試了下面的方法,但結果並不如預期。

java.util.Date temp = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss.SSSSSS").parse("2012-07-10 14:58:00.000000"); 

DateFormat dateFormat = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss"); 
       Date thisDate = dateFormat.parse("2012-07-10 14:58:00.000000"); 

結果是「2012年1月10日14:58:00 EST」。請讓我知道我出錯的地方。

感謝, Yeshwanth哥打

+0

什麼是輸出「2012年1月10日14:58:00 EST」?你正在運行'System.out.println(thisDate)'嗎? – Gili

+2

你使用'mm'幾分鐘和幾個月。您是如何期望SimpleDateFormat能夠在提供的字符串中區分幾分鐘和幾個月?請再次閱讀javadoc中的模式表:http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat。html – BalusC

+0

@Gili:是的,我正在使用System.out.println(thisDate)。 –

回答

44
java.util.Date temp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSS").parse("2012-07-10 14:58:00.000000"); 

mm是分鐘你想MM

CODE

public class Test { 

    public static void main(String[] args) throws ParseException { 
     java.util.Date temp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSS") 
       .parse("2012-07-10 14:58:00.000000"); 
     System.out.println(temp); 
    } 
} 

打印:

星期二年07月10十四時58分00秒EDT 2012

+0

我使用了System.out.println(temp),結果仍然相同。我很抱歉,如果我犯了一個愚蠢的錯誤,但我無法弄清楚。 –

+0

@YeshwanthKota你重新編譯了你的代碼嗎? – Woot4Moo

+0

是的,我做到了。我只是有System.out.println(temp);在我的代碼中。 –

0

以供將來參考:

yyyy => 4 digit year 
MM => 2 digit month (you must type MM in ALL CAPS) 
dd => 2 digit "day of the month" 

HH => 2-digit "hour in day" (0 to 23) 
mm => 2-digit minute (you must type mm in lowercase) 
ss => 2-digit seconds 
SSS => milliseconds 

所以 「YYYY-MM-DD HH:MM:SS」 返回「2018年1月5日09 :49:32"

但是, 「MMM DD,YYYY HH:MM一個」 返回 「2018年1月5日上午9時49分」

https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html所謂的例子只顯示輸出。他們不會告訴你使用什麼格式!

+0

僅供參考,SimpleDateFormat類的麻煩多年來一直由Java 8和9中內置的java.time類過時。[DateTimeFormatter](https:// docs。 oracle.com/javase/9​​/docs/api/java/time/format/DateTimeFormatter.html)。應避免與最早版本的Java捆綁在一起的舊日期時間類。 –

0

TL;博士

LocalDateTime.parse( 
    "2012-07-10 14:58:00.000000".replace(" " , "T") 
) 

微秒不適合

您正試圖擠壓用微秒(六個小數位數)只能夠毫秒分辨率的數據類型的值(三個十進制數字) 。那是不可能的。

而是使用具有足夠精細分辨率的數據類型。 java.times類使用納秒分辨率(九位十進制數字)。

不分區輸入不適合劃型

您正試圖把一個缺乏任何價值偏移從-UTC或時區爲數據類型(Date),僅代表UTC值。因此,您要添加輸入不具備的信息(UTC偏移量)。

改爲使用適當的數據類型。具體來說,java.time.LocalDateTime

大小寫

其他答案和評論正確地解釋該格式的圖形碼區分大小寫。所以MMmm有不同的效果。與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,YearQuartermore

相關問題