簡體   English   中英

如何防止FastDateFormat模式“yyyy-MM-dd”以“dd-MM-yyyy”格式解析String

[英]How to prevent FastDateFormat pattern “yyyy-MM-dd” from parsing String in format “dd-MM-yyyy”

我有兩個格式字符串用於日期解析:“yyyy-MM-dd”和“dd-MM-yyyy”我希望FastDateFormat類能夠區分這兩個,以便一個人通過ParseException而另一個會工作。 但是,兩種格式都解析相同的字符串值,其中一個顯然正確解析而另一個不正確。

我的測試代碼顯示:

Parsed: "2014-06-06" into Fri Jun 06 00:00:00 EDT 2014 using "yyyy-MM-dd"
Parsed: "2014-06-06" into Sat Dec 05 00:00:00 EST 11 using "dd-MM-yyyy"
Parsed: "06-06-2014" into Sat Dec 05 00:00:00 EST 11 using "yyyy-MM-dd"
Parsed: "06-06-2014" into Fri Jun 06 00:00:00 EDT 2014 using "dd-MM-yyyy"

有沒有簡單的方法讓FastDateFormat根據模式正確處理4位數年份?“我沒有在FastDateFormat上看到任何寬松的設置。

我可以使用Apache-Common-Lang-library重現您的結果。 似乎API沒有提供任何官方解決方案,也沒有提供最新版本的v3.3.2。 通常一個好的解析器會通過拋出異常來拒絕模式dd-MM-yyyy的輸入2014-06-06,但是FastDateFormat在這里容忍它,甚至不能像SimpleDateFormat那樣設置為非寬松模式。

所以剩下的唯一選擇是:

a) 做你自己的hack (類似於下面的代碼示例):

public class ParserDDMMYYYY extends FastDateFormat {
  public static final INSTANCE = 
    new ParserDDMMYYYY("dd-MM-yyyy", TimeZone.getDefault(), Locale.getDefault());

  @Override
  public Date parse(String input) throws ParseException {
    if (input.charAt(4) == '-') {
      throw new ParseException("Invalid format: " + input, 0);
    }
    return super.parse(input);
  }

  // ... more overrides of similar parse methods
}

防止模式yyyy-MM-dd的dd-MM-yyyy的情況非常相似。

b) 或者您更改日期時間庫,因為至少有三個更好的庫用於日期時間處理和格式化。 請記住,apache-library仍然基於舊的java.util.* - 和java.text.* -packages。

我還懷疑FastDateFormat類的FastDateFormat是否真的好得多,與其他日期時間庫的不可變版本相比肯定不會更好。 例如,我在apache庫中看到了一些synchronized-keywords(潛在的鎖競爭,不那么現代)。

我的解決方案是格式化解析的Date並將String與原始Date進行比較。 這比檢查特定字符是否在特定位置更通用,但它也更慢。 它允許您讓用戶配置格式。

private final FastDateFormat myDateFormat = FastDateFormat.getInstance("dd-MM-yyyy");

public Date parseDate(String dateString) throws ParseException {
   final Date parsedDate = myDateFormat.parse(dateString);
   if(dateString != timeRangeDateFormat.format(parsedDate)){
      throw new ParseException("Strict mode engaged", 0);
   }
}         

暫無
暫無

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

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