首页 > 解决方案 > SimpleDateFormat 解析有什么问题

问题描述

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”

标签: java

解决方案


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

推荐阅读