我使用以下代码格式化日期。但是当我以错误的格式提供数据时,它会给出意想不到的结果。
DateFormat inputFormat = new SimpleDateFormat("yyyy/MM/dd");
DateFormat outputFormat = new SimpleDateFormat("yyyy-MM-dd");`
String dateVal = "3/8/2016 12:00:00 AM";
try {
Date date = inputFormat.parse(dateVal);
String formattedVal = outputFormat.format(date);
System.out.println("formattedVal : "+formattedVal);
} catch (ParseException pe) {
throw pe;
}
在上面的例子中,输出是 - formattedVal:0009-02-05。
它不是抛出Parse异常,而是解析值并给出错误的输出。有人可以帮我理解这种异常行为。
答案 0 :(得分:7)
日期解析器尽最大努力将给定的字符串解析为日期。
此处3/8/2016
使用年/月/日格式进行解析,以便:
所以年= 3 + 5.5 = 8.5 + 0.667 = 9.17。这给了09年2月5日。
答案 1 :(得分:3)
SimpleDateFormat
在内部使用Calendar
对象。 Calendar
类有两种模式, lenient 和 strict 。在 lenient 模式中,默认情况下,它接受不同字段的超出范围值,并通过调整其他字段来规范化这些值,在您的情况下,将年份字段提前约五个半。
尝试将SimpleDateFormat
日历实例设置为严格:
inputFormat.setLenient(false);
你真的应该使用java.time
类,或者如果Java 8不是选项则使用JodaTime。
答案 2 :(得分:1)
阅读SimpleDateFormat的文档:
年份:...... 任何其他数字字符串,例如一位数字符串,三位或更多 数字字符串,或不是所有数字的两位数字符串(for 例如,“-1”),按字面解释。所以“01/02/3”或“01/02/003” 使用相同的模式解析,如公元1月2日。同样, “01/02 / -3”被解析为公元前4月2日。
答案 3 :(得分:0)
public static void main(String[] args) {
try {
String dateVal = "3/8/2016 12:00:00 AM";
DateFormat inputFormat = new SimpleDateFormat("d/M/yyyy hh:mm:ss a");//the pattern here need to bee equals the 'dateVal' format
DateFormat outputFormat = new SimpleDateFormat("yyyy-MM-dd");
Date date = inputFormat.parse(dateVal);
String formattedVal = outputFormat.format(date);
System.out.println("formattedVal : "+formattedVal);
} catch (ParseException pe) {
System.err.println("cannot parse date...");
}
}