RFC822时区解析Java

问题描述 投票:8回答:7

我有一个JS日期,由Dojo转换为RFC822格式。函数调用--dojo.date.toRfc3339(jsDate)生成以下日期 - 2007-02-26T20:15:00 + 02:00。

我有一个应用程序使用Java日期SimpleDateFormat来解析上面生成的日期。由于时区,我在解析此日期格式时遇到问题。我试图使用

YYYY-MM-DD'T'hh:MM:SSZ

这失败了,因为时区的'Z'不期望':'字符。有谁知道如何指定一个模式来处理带有':'的RFC822日期?

修订:

感谢您正确解释我想要做的事情:)我想说的是日期是在RFC3339中生成的,我需要RFC822。看起来我将不得不重写JavaScript。我希望我不必这样做,并且可以指定日期格式模式而不必修改任何Java代码,因为日期格式只是注入到应用程序的Spring bean中。

只是为了完整性,有没有办法在日期格式表达式中指定忽略序列中的字符(不进行字符串操作/替换)?在这种情况下,我会说忽略任何':'或者只是忽略所有时区?

java date iso8601 rfc822 rfc3339
7个回答
4
投票
import java.text.SimpleDateFormat;
import java.util.Date;

public class DateUtil {

    public static Date ParseRFC3339DateFormat(String p_date)
    {
        try{
            SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
            String dts = p_date.replaceAll("([\\+\\-]\\d\\d):(\\d\\d)","$1$2");
            return formatter.parse(dts);
        }catch (Exception e) {
                return null;
        }
    }
}

3
投票

这有效

SimpleDateFormat format = new SimpleDateFormat("yyyy-mm-DD'T'hh:mm:ssZ");
format.parse("2007-02-26T20:15:00+02:00".replaceAll("([\\+\\-]\\d\\d):(\\d\\d)","$1$2"));

(注意我在'Z'格式说明符之后将格式中的最终冒号取出。)


2
投票

RFC822不允许冒号位于日期的时区部分。它只需要4位数。该Dojo方法的名称表示它正在使用RFC3339。它似乎与ISO8601的格式几乎相同。恰好如果你能够使用该库,Joda TimeISODateTimeFormat与ISO8601兼容。方法dateTimeNoMillis()看起来像是与Dojo格式的匹配。它确实比标准的Java日期和时间API更好。否则高度咖啡因的建议将是要走的路。

更新以回应Jamen的更新

难道没有办法让Dojo使用不包含时区的格式吗?然后,您可以调整Java端的格式以匹配。我对Dojo了解不多,但我找不到它提供的toRfc3339函数的任何文档。


1
投票

我将':'从时区中剥离出来并使用上面的格式。


1
投票

您可以使用自定义格式字符串创建自己的函数,而不是使用dojo.date.toRfc3339(jsDate)。

类似下面的内容会删除冒号,并且应该可以通过java格式进行解析。

function toRfc3339String(jsDate){
    return dojo.date.locale.format(jsDate,{selector: 'date', datePattern:'yyyy-MM-dd\'T\'hh:mm:ssZ'});
}

1
投票

你可以在没有Java 7的情况下做到这一点。我在2012年在StackOverflow上提出了2个问题,所以有一个解决方案不需要任何第三方库。

只需检查我的latest question描述中提供的实现,这也指出了之前正在讨论此问题的实现。


1
投票

在Java 8中,您可以使用:

Instant.from(DateTimeFormatter.RFC_1123_DATE_TIME.parse( rfc822Time ) );

仅供参考:https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html#RFC_1123_DATE_TIME

© www.soinside.com 2019 - 2024. All rights reserved.