【问题标题】:What's wrong SimpleDateFormat parsing [duplicate]SimpleDateFormat解析出了什么问题[重复]
【发布时间】:2020-05-26 07:22:56
【问题描述】:
public static String Date() throws IOException
{
    URL url = new URL(target);
    URLConnection conn = url.openConnection();

    Map headers = conn.getHeaderFields();
    Set<String> keys = headers.keySet();
    String gmtTime = conn.getHeaderField("Date");
    gmtTime = gmtTime.replace("GMT", "").trim();
    SimpleDateFormat format = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss");
    java.util.Date date = null;
    try {
        System.out.println(gmtTime);
        date = format.parse(gmtTime); 
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return gmtTime;
}

Tue, 26 May 2020 07:08:22
java.text.ParseException: Unparseable date: "Tue, 26 May 2020 07:08:22"
at java.base/java.text.DateFormat.parse(DateFormat.java:395)
at ex.Time.Date(Time.java:34)
at ex.ServerTime_CMW.draw(ServerTime_CMW.java:35)
at processing.core.PApplet.handleDraw(PApplet.java:2482)
at processing.awt.PSurfaceAWT$12.callDraw(PSurfaceAWT.java:1547)
at processing.core.PSurfaceNone$AnimationThread.run(PSurfaceNone.java:313)

我不知道为什么会发生 ParseException... 我的日期字符串是“Tue, 26 May 2020 07:08:22” 我认为的格式是“EEE,dd MMM yyyy HH:mm:ss”

【问题讨论】:

  • 大胆猜测:在您的语言环境中,星期二不是“星期二”吗?
  • repl.it/repls/HungryExcitingBoolean 另外我建议使用java.time DateTimeFormatter,LocalDateTime,那里更容易使用
  • SimpleDateFormat 格式 = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss", Locale.ENGLISH);工作完成!!谢谢!!!!
  • 此时我想知道“May”是如何用您的语言书写的,因为它似乎有效。
  • 还可以查看来自Java - Unparseable date 的答案,了解如何在不使用过时、过时的 Java API 的情况下执行此操作:stackoverflow.com/a/44017483/5698098

标签: java


【解决方案1】:

dd MMM yyyy 不适用于所有语言环境。在美国,是的。在加拿大,不……这在加拿大不是合法的解析格式。如果您使用的是替换过时的 java.util.Date 类的新时间库,那么您可以通过将 Locale.Root 作为第二个参数传递给格式调用来转义您的 Locale。

编辑:在加拿大,我必须从银行 pdf 格式化 dd MMM yyyy,我不得不离开我的默认区域设置,并使用它。当然,Java 8 时代。多态是我的其他日期调用工作,而无需传递语言环境。我可以通过另一种方法 Locale.ROOT 来获得难以捉摸的 'dd MMM yyyy' 格式。

    public static LocalDate parseDate( final String format, final String s ) {
        return parseDate( format, s, java.util.Locale.getDefault() );
    }

    public static LocalDate parseDate( final String format, final String s, final Locale loc ) {

        final DateTimeFormatter df = DateTimeFormatter.ofPattern( format, loc );
        LocalDate ld;   // Check if this was a legal LocalDate.
        try {
            ld = LocalDate.parse(s, df);
        } catch (java.time.format.DateTimeParseException pe) {
            //System.out.println( pe.getMessage() );
            ld = null;  // This will signal an error
        }
        return ld;
    }

【讨论】:

  • 只是一个提示。在编写新答案并投入时间之前,有必要检查一下该问题是否已经被问及并得到了回答。参见例如Java - Unparseable date
  • 我想我最好弄清楚如何快速链接其他问题。因为这是我几天前对此问题的答案。我本可以将我自己的问题联系起来。顺便说一句,当您不知道答案或问题所在时,无需搜索,就可以在任何地方找到有关此的任何信息。这也是我前几天问的原因。我总是先搜索。
猜你喜欢
  • 2011-04-07
  • 1970-01-01
  • 1970-01-01
  • 2019-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-09
  • 1970-01-01
相关资源
最近更新 更多