【问题标题】:Unparseable date Exception java date pattern [duplicate]无法解析的日期异常java日期模式[重复]
【发布时间】:2019-12-09 05:42:32
【问题描述】:

我在尝试使用这种格式解析日期时遇到错误:

2001 年 3 月 26 日 2001 年 8 月 15 日

我正在使用下一个代码:

    private void parseDate(String firstDate) {
        Date fDate = null;
        try {
            fDate = new SimpleDateFormat("dd-MMM-yyyy").parse(firstDate);
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }

但我收到错误消息:无法解析的日期:“2001 年 8 月 15 日”。我不太确定我必须使用什么日期格式。

谢谢

【问题讨论】:

  • 尝试添加 4M(7 月/8 月)而不是 3M(7 月/8 月)。所以要得到完整的月份,MMMM 就是你要找的
  • 仅供参考,java.util.Datejava.util.Calendarjava.text.SimpleDateFormat 等非常麻烦的日期时间类现在是 legacy,被 Java 8 及更高版本中内置的 java.time 类所取代.见Tutorial by Oracle

标签: java date parsing


【解决方案1】:

使用Locale.US,以便它考虑美国格式的月份名称

SimpleDateFormat("dd-MMM-yyyy",Locale.US)

看到这个code run live at IdeOne.com

【讨论】:

    【解决方案2】:

    tl;博士

    LocalDate
    .parse(
        "15-August-2001" , 
        DateTimeFormatter.ofPattern( "dd-MMMM-uuuu" , Locale.US )
    )
    .toString()
    

    提示:最好仅使用标准 ISO 8601 格式以文本形式交换日期时间数据。

    java.time

    Answer by Deadpool 虽然在技术上是正确的,但已经过时了。现代方法使用 java.time 类,通过采用 JSR 310 取代了旧的日期时间类。

    LocalDate

    LocalDate 类表示仅日期值,没有时间,也没有 time zoneoffset-from-UTC

    DateTimeFormatter

    使用DateTimeFormatter.ofPattern 定义自定义格式模式。格式化代码与旧的 SimpleDateFormat 类并不完全相同,因此请务必仔细研究 Javadoc。

    指定 Locale 以确定用于翻译月份名称的人类语言。

    String input = "15-August-2001" ;
    DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd-MMMM-uuuu" , Locale.US ) ;
    LocalDate ld = LocalDate.parse( input , f ) ;
    
    System.out.println( "ld.toString(): " + ld ) ;
    

    看到这个code run live at IdeOne.com

    ld.toString(): 2001-08-15

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多