簡體   English   中英

如何僅解析四位數年份(使用 Joda Time)?

[英]How to parse four digit year only (with Joda Time)?

有沒有辦法強制 Joda 時間僅在包含四位數年份時才解析日期? 例如:

  • 2009-11-11 - 應該解析
  • 09-11-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
  • 還有很多...

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

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

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

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

你想從輸入'0001-01-01'作為日期的用戶得到什么(也就是說,他們輸入了4位數,但前三位是零)? 那么'0999-12-31'怎么樣? '999-12-31'? 那么'10000-01-01' - 臭名昭着的Y10K 1問題呢?

  • 如果這是一個合法的值,那么你就會發現用戶鍵入的日期長度(可能是在完成任何其他解析之后),並確保它至少是(或者它是否正確) ?) 四位數。

  • 如果這不是合法的值,那么在解析日期之后,您將無法檢查年份值。

  • 或者您可以獲取代碼並對其進行修改,使其包含您對有效年份的首選定義。


1我不打算在5000-01-02之前開始修復Y10K問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM