[英]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.