【问题标题】:DateFormat giving wrong answerDateFormat 给出错误答案
【发布时间】:2016-03-09 12:25:54
【问题描述】:

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

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 异常,而是解析值并给我一个不正确的输出。有人可以帮我理解这种异常行为吗?

【问题讨论】:

  • 预期输出应该如何?

标签: java date


【解决方案1】:

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

这里3/8/2016被解析为年/月/日格式,所以:

  • 年 = 3
  • month = 8 --> 8 个月是 0.667 年
  • day = 2016 --> 2016 天约为 5.5 年

所以年份 = 3 + 5.5 = 8.5 + 0.667 = 9.17。这给出了 09 年 2 月 5 日。

【讨论】:

  • 很好的解释! +1
【解决方案2】:

SimpleDateFormat 在内部使用 Calendar 对象。 Calendar 类有两种模式,lenientstrict。在默认的 lenient 模式下,它接受不同字段的超出范围的值,并通过调整其他字段来规范化这些值,在您的情况下,将年份字段提前大约五手半。

尝试将SimpleDateFormat 日历实例设置为严格:

inputFormat.setLenient(false);

你真的应该改用 java.time 类,或者如果 Java 8 不是一个选项,则使用 JodaTime。

【讨论】:

  • 对宽大行为的很好解释,对java.timeJodaTime的明智建议! +1
【解决方案3】:

阅读SimpleDateFormat的文档:

年份:... 任何其他数字字符串,例如一位数字字符串、三位或更多 数字字符串,或不是所有数字的两位数字字符串(对于 例如,“-1”)按字面意思解释。所以“01/02/3”或“01/02/003” 使用与公元 3 年 1 月 2 日相同的模式进行解析。同样地, “01/02/-3”被解析为 Jan 2, 4 BC。

【讨论】:

    【解决方案4】:
    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...");
            }
        }
    

    【讨论】:

    • 虽然此代码看起来正确,但它没有回答 OP 的问题:解释行为。
    猜你喜欢
    • 1970-01-01
    • 2014-11-19
    • 2020-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-05
    • 2014-06-04
    • 1970-01-01
    相关资源
    最近更新 更多