【问题标题】:How to properly format unusual date string using Java SimpleDateFormat?如何使用 Java SimpleDateFormat 正确格式化异常日期字符串?
【发布时间】:2011-09-26 08:56:47
【问题描述】:

我有以下格式的日期:

Pon Cze 07, 2011 9:42 pm

它是波兰语,相当于英语日期:

Mon Jun 07, 2011 9:42 pm

我正在使用以下 SimpleDateFormat 匹配器:

SimpleDateFormat("EEE MMM dd, yyyy H:mm a", new Locale("pl", "PL"))

但由于 AssertionFailedError 无法解析日期。我尝试了其他一些解决方案,但没有人适合我。你知道我做错了什么吗?

【问题讨论】:

  • 你试过JodaTime吗? - joda-time.sourceforge.net
  • JodaTime 比 SimpleDateFormat 稍慢,因为它调用 SimpleDateFormat 来解析日期。这个项目的性能是最重要的,所以我坚持使用 SimpleDateFormat。
  • 我已经解决了我的问题 - 我使用了 DateFormatSymbols setShortWeekdays 方法并将“H”更改为小写。现在可以正确解析日期。 现在由于 Stackoveflow 对新用户的限制,我无法回答我的问题,但在接下来的 7 小时后,我将代码粘贴为答案。
  • 请发表你的答案

标签: java parsing date simpledateformat matcher


【解决方案1】:

有两个问题:

  1. 在 pl 语言环境中,日期是 wt,而不是 Pon
  2. 没有考虑 AM/PM 指示符,因为您使用了 H(表示从 0 到 23 的小时)而不是 h

我只会从第一个空格之后的第一个字符开始解析(以避免解析“Pon”),并将H 替换为h。在模式中:

DateFormat df = new SimpleDateFormat("MMM dd, yyyy h:mm a", new Locale("pl", "PL"));
Date d = df.parse(s.substring(s.indexOf(' ') + 1));

【讨论】:

    【解决方案2】:

    似乎一周中的某一天仅由两个字母表示,无论原因是什么。 试试这个代码并检查输出

        SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd, yyyy H:mm a", new Locale("pl", "PL"));
        GregorianCalendar gc = new GregorianCalendar(new Locale("pl", "PL"));
        gc.setTime(new Date(System.currentTimeMillis()));
        System.out.println(sdf.format(gc.getTime()));
    

    我的输出是:“Wt wrz 27, 2011 11:05 AM”

    所以如果你尝试两个字母的工作日,它可能会工作

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-14
      • 1970-01-01
      • 1970-01-01
      • 2012-05-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多