2009-10-23 120 views
4

有沒有辦法強制約達時間解析日期,只有當他們包含四位數年?例如:如何僅解析四位數年份(與喬達時間)?

  • 2009-11-11 - 應該解析
  • 11年9月11日 - 不應該解析

試過以下代碼:

DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder(); 
DateTimeFormatter formatter = builder.appendYear(4, 4).appendLiteral('-').appendMonthOfYear(1).appendLiteral('-').appendDayOfMonth(1).toFormatter(); 
formatter.parseDateTime("09-11-11"); 

解析成0009 -11-11。顯然,方法appendYear中的minDigits僅在打印日期時用於格式化。
如果我使用appendYearOfEra(),結果是一樣的。如果我使用appendYearOfCentury(),它會將年份解析爲1909年。

我們正在實現一個通用數據解析器,它將識別各種類型的輸入。這個例子也是真實交易的縮寫形式(爲了簡單起見)。真實生活場景分析日期,可以有工作日,月份作爲文字,時間,地區和不同的字符分隔月份,日期和年份。因此,編寫正則表達式或檢查字符串的內容/長度可能相當困難。

一些實際例子看起來是這樣的:

  • 2009-11-11
  • 週三2009-11-11T15:00:00
  • 2009/11/11 15:00
  • 還有更多...

回答

6

DateTimeFormatterBuilder.appendFixedDecimal()可能會做你需要的。

或者,您可以實現DateTimeParser接口來創建所需的任何解析器並將其傳遞到DateTimeFormatterBuilder中。

+0

我是盲人!非常感謝。順便說一下,該方法稱爲appendFixedDecimal()。 – 2009-11-18 15:43:58

1

您可以使用DateTimeFormatterBuilder構建極其特定的解析器和格式器。通常不需要直接使用這個類,因爲大多數常用格式在API的其他地方更容易獲得,但這是他們在封面下使用的構建器類。

+0

我編輯了與您的建議結果的帖子。不幸的是我無法得到它的工作。謝謝! – 2009-10-23 09:45:35

+1

嗯,有趣的是,我不會期待這一點。我建議喬達時間的郵件列表,作者()掛在那裏。 – skaffman 2009-10-23 10:03:31

1

您可以檢查日期字符串的長度。

+0

問題是你會希望parseDateTime方法檢查 – Tarski 2011-06-10 13:25:34

+0

@Tarski,如果它確實會很好。你可以改變圖書館來做到這一點,並建議他們更新他們的圖書館。 – 2011-06-10 13:28:49

0

你想從輸入'0001-01-01'作爲日期的用戶得到什麼(即他們年度輸入4位數,但前三位是零)? '0999-12-31'怎麼樣?和'999-12-31'?那麼'10000-01-01' - 臭名昭着的Y10K 問題呢?

  • 如果這是一個合法的值,那麼你被卡住發現什麼是用戶輸入的日期(任何其他解析已經完成大概之後)的年份部分的長度,並確保它是至少(或者恰好?)四位數字。

  • 如果這不是一個合法的值,那麼您在解析日期之後檢查年份值會停滯不前。

  • 或者您可以將代碼修改幷包含您對有效年份的首選定義。


我不打算開始之前5000-01-02固定Y10K問題的工作。

+0

我正在尋找一種方法將其限制爲四位數,所以0999將被視爲999年,而999則不會被解析。 Y10K也不是問題......至少還沒有。無論如何,它似乎是唯一的解決方案是在解析它之前檢查字符串。 – 2009-10-30 10:38:27