2012-01-28 18 views
2

以下Java代碼僅使用SimpleDateFormat解析日期(使用時間部分)2009-01-28-09:11:12。讓我們看看它。Java中的Wonky約會

final public class Main 
{ 
    public static void main(String[] args) 
    {    
     try 
     { 
      DateFormat df = new SimpleDateFormat("yyyyMMddHHmmss"); 
      Date d = df.parse("2009-01-28-09:11:12"); 
      System.out.println(d); 
     } 
     catch (ParseException ex) 
     { 
      Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 
} 

由上述代碼(隨時間)顯示(解析後)中的日期爲如下,

Sun Nov 30 22:07:51 IST 2008 

即使我們試圖解析日期2009-01-28-09:11:12。它看起來有些不可思議。爲什麼解析是這樣的?

+0

你問問2008年11月30日來自哪裏,或者只是如何解決它? – 2012-01-28 17:21:52

+0

是的。下面的答案是令人滿意的,但實際問題是爲什麼當我使用問題中提到的日期格式時,它顯示爲什麼?如果日期格式無效,則不應解析,如果有效,則應該正確解析。 – Lion 2012-01-28 17:30:23

回答

5

應該不是你的日期格式是這樣的:

DateFormat df = new SimpleDateFormat("yyyy-MM-dd-HH:mm:ss"); 

符合此格式:

Date d = df.parse("2009-01-28-09:11:12"); 

至於爲什麼,每本:

解析器實際上看這些數字,而訣竅是 - 是一個數字,代表負數的一部分。所以,如果你這樣做:

df.parse("2009-01-02-00:00:00") 

它給:

Mon Dec 01 00:02:00 EST 2008 

這解析2009年爲yyyy,然後-0爲MM(這是前一個月的月從1開始),然後1爲DD,等

如每解析DateFormat中:

默認情況下,解析是寬鬆的:如果輸入不在此對象的格式方法使用的表單中,但仍然可以解析爲日期,則解析成功。客戶可以通過調用setLenient(false)來堅持嚴格遵守格式。

我想,如果你有一個選項,如果你喜歡2009/01/02 12:34:56等格式,最好使用斜線而不是破折號。這:

df.parse("2009/01/02-00:00:00") 

將拋出一個異常:

ERROR java.text.ParseException: 
Unparseable date: "2009/01/02-00:00:00" 

我只能斷定這是一個非常好的事情,/不被認爲是由DateFormat的多個分裂...

+0

我現在可以想象,今年很容易,只是在2009年。在我們對月份的解釋中,沒有月份爲0,1月將是1.因此,這將是1月份之前的一個月,換句話說'2008年12月'。今天是第一天。接下來是我想象中應該設置爲28的小時,但讀爲-2。也許由於'yyyyMMdd'開始令人困惑,時間被抵消了一個字符。由於小時是-2,分鐘設置爲8,第二個爲-09。如果我們從2008年12月1日減去2小時,我們會在2008年11月30日的22:00:00。 – Lion 2012-01-28 17:47:02

+0

然後我們增加8分鐘並減去9秒,因此有7分51秒。最終結果是2008年11月30日22時07分51秒。 – Lion 2012-01-28 17:47:30

+0

我如何認爲它得到了解釋:'year = 2009; 月= -0; day = 1; 小時= -2; 分鐘= 8; second = -09' – Lion 2012-01-28 17:52:53

2

嗯,你可能定義的格式,你實際上解析...

1

默認情況下,日期在寬鬆模式下進行解析。這意味着,如果它不是閏年,那麼它就會像寬帶1一樣解析feb 29。你要求它解析的是2009年第一個月的第二十八天,它忠實地給你準確的要求。

要關閉此行爲,請調用format.setLenient(false)。然後,如果您嘗試解析不是真實日期的東西,則dateformat會拋出異常。