【问题标题】:java: ParseException: Unparseable date [duplicate]java:ParseException:无法解析的日期[重复]
【发布时间】:2019-01-14 05:59:56
【问题描述】:

我有一个SimpleDateFormat format = new SimpleDateFormat("d M y H:m");,我尝试用它解析字符串"8 Jan 2019 16:47",但我得到一个ParseException。我是否以错误的方式创建它? 根据 docs.oracle.com,M 应该识别 3-letter-months。 谁能帮帮我?

【问题讨论】:

  • Jan 不适合 M。尝试使用 MMM 而不是 M 作为月份部分。
  • @ernest_k 你的建议is working in this demo.
  • 我建议你不要使用SimpleDateFormatDate。这些类设计不佳且早已过时,尤其是前者,尤其是出了名的麻烦。而是使用来自java.time, the modern Java date and time APILocalDateTimeDateTimeFormatter

标签: java simpledateformat datetime-parsing parseexception unparseable


【解决方案1】:

官方文档:(https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html)

您可能在这里错过了这个小提示:

月份:如果模式字母的数量为3个或更多,则月份被解释为文本;否则,它被解释为一个数字。

根据您的示例输入,以下工作:

SimpleDateFormat format = new SimpleDateFormat("dd MMM yyyy HH:mm");

【讨论】:

    【解决方案2】:

    java.time

        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("d MMM y H:mm", Locale.ENGLISH);
    
        String stringToParse = "8 Jan 2019 16:47";
        LocalDateTime dateTime = LocalDateTime.parse(stringToParse, formatter);
        System.out.println(dateTime);
    

    这个sn-p的输出是:

    2019-01-08T16:47

    你的代码出了什么问题?

    SimpleDateFormatDate 设计不佳且已过时,尤其是前者非常麻烦。我建议你不要在 2019 年使用它们。

    正如其他人所说,您需要三个 M 来表示月份的缩写(无论您使用的是过时的 SimpleDateFormat 还是现代的 DateTimeFormatter)。一个M 将匹配1 位或2 位数字的月份,例如1 表示一月。

    您还应该为格式化程序指定一个区域设置。我把Jan 当作英语,所以指定Locale.ENGLISH。如果您不指定语言环境,则将使用 JVM 的默认语言环境,这可能在某些 JVM 上运行良好,但有一天会在默认语言环境已更改或您尝试在另一台计算机上运行程序时突然中断。

    链接

    Oracle tutorial: Date Time 解释如何使用java.time

    【讨论】:

      猜你喜欢
      • 2017-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-06
      • 1970-01-01
      • 2019-12-09
      相关资源
      最近更新 更多