【问题标题】:java.text.ParseException: Unparseable date: convert mm/dd/yyyy string to a datejava.text.ParseException:无法解析的日期:将 mm/dd/yyyy 字符串转换为日期
【发布时间】:2014-09-16 15:24:19
【问题描述】:

当我将mm/dd/yyyy 格式的字符串对象转换为Date 时,它给了我

java.text.ParseException: Unparseable date: "09/17/2014"

我正在尝试这样做:

String date= "09/17/2014";
DateFormat df = new SimpleDateFormat();
Date journeyDate= (java.sql.Date) df.parse(date);

【问题讨论】:

  • 我建议你不要使用 SimpleDateFormat 和两个 Date 类。这些类设计不佳且早已过时,尤其是第一个类是出了名的麻烦。而是使用来自java.time, the modern Java date and time APILocalDateDateTimeFormatter

标签: java date simpledateformat


【解决方案1】:

这里有几个潜在的问题:

  • 您没有指定格式
  • 您没有指定语言环境
  • 您没有指定时区
  • 您正在尝试将返回值(将是 java.util.Date 引用)转换为 java.sql.Date - 这会失败

你想要这样的东西:

DateFormat df = new SimpleDateFormat("MM/dd/yyyy", Locale.US);
df.setTimeZone(...); // Whatever time zone you want to use
Date journeyDate = new java.sql.Date(df.parse(text).getTime());

【讨论】:

  • 嗨,乔恩月不能是 17 岁,即使 +1 以获得很好的解释,您也需要切换它
  • @SparkOn:哎呀 - 已修复,谢谢。出于某种原因误读了问题。
【解决方案2】:
DateFormat df = new SimpleDateFormat("MM/dd/yyyy",Locale.ENGLISH);
Date journeyDate = df.parse(date); // gives you java.util.Date

如果你想要 java.sql.Date 那么

java.sql.Date sqlDate = new java.sql.Date(journeyDate.getTime());

【讨论】:

    【解决方案3】:

    我有以下例外:

    java.text.ParseException: 无法解析的日期

    System.out.println("inside the XMLGregorianCalendar");
    
    sb = (String) map.get(fieldname);
    System.out.println("THis is XMLGReogoriaaaaan calendar"+ sb);
    DateFormat df = new SimpleDateFormat("yyyy-MM-dd", Locale.US);
    Date journeyDate = new java.sql.Date(df.parse(sb).getTime());
    System.out.println("this"+journeyDate);
    

    【讨论】:

    • 这是一个答案还是您面临的问题?
    【解决方案4】:

    您混合了mM

    m 代表分钟,M 代表月份。

    以下是工作格式的示例。

    SimpleDateFormat formatter = new SimpleDateFormat("MM/dd/yyyy");
    String dateInString = "07/06/2013"; 
    Date date = formatter.parse(dateInString);
    System.out.println(formatter.format(date));
    

    【讨论】:

      【解决方案5】:

      java.time

      我建议您使用现代 Java 日期和时间 API java.time 来进行日期工作。您可以通过 JDBC(自 JDBC 4.2 起)或 JPA(例如自 Hibernate 5.0 起)直接将 java.time.LocalDate 传递给您的 SQL 数据库。

      您需要指定解析的格式:

      private static final DateTimeFormatter DATE_FORMATTER 
              = DateTimeFormatter.ofPattern("MM/dd/uuuu", Locale.ENGLISH);
      

      剩下的很简单:

          String date = "09/17/2014";
          LocalDate journeyDate = LocalDate.parse(date, DATE_FORMATTER);
          System.out.println(journeyDate);
      

      输出:

      2014-09-17

      我假设您试图指定您想要java.sql.Date,因为您需要它与 SQL 数据库一起使用。但是你不需要java.sql.Date。如何在 SQL 中插入LocalDate,见底部链接。

      如果您需要 java.sql.Date 来获取您现在无法升级到 java.time 的旧版 API,那么转换也很简单:

          java.sql.Date oldfashionedJavaSqlDate = java.sql.Date.valueOf(journeyDate);
          System.out.println(oldfashionedJavaSqlDate);
      

      2014-09-17

      你的代码发生了什么?

      Jon Skeet 已经指出了您的代码存在的问题。但只是出于好奇,更准确地说,发生了什么?无参数 SimpleDateFormat 构造函数为您提供默认语言环境中日期和时间的本地化格式。例如对于en-IN 语言环境,格式可能类似于17/09/14, 12:00 AM。在这种情况下,您的格式化程序会将 09 解析为月份中的某天,将 17 解析为月份,并将 2014 解析为年份,然后抱怨异常,因为字符串中不存在逗号和时间。

      链接

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-05-19
        • 1970-01-01
        • 2011-11-01
        • 1970-01-01
        • 2014-08-09
        • 2018-03-27
        • 1970-01-01
        • 2021-03-19
        相关资源
        最近更新 更多