DateFormat给出了错误的答案

时间:2016-03-09 12:25:55

标签: java date

我使用以下代码格式化日期。但是当我以错误的格式提供数据时,它会给出意想不到的结果。

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异常,而是解析值并给出错误的输出。有人可以帮我理解这种异常行为。

4 个答案:

答案 0 :(得分:7)

日期解析器尽最大努力将给定的字符串解析为日期。

此处3/8/2016使用年/月/日格式进行解析,以便:

  • year = 3
  • month = 8 - > 8个月是0。667年
  • day = 2016 - > 2016年是〜5。5年

所以年= 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...");
        }
    }