8

我有一个被 Dojo 转换为 RFC822 格式的 JS 日期。函数调用 - 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 中。

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

4

7 回答 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;
        }
    }
}
于 2012-01-23T13:53:45.903 回答
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”格式说明符之后的最后一个冒号从格式中删除。)

于 2010-05-12T23:38:15.160 回答
2

RFC822 不允许冒号出现在日期的时区部分。它只需要 4 位数字。该 Dojo 方法的名称表明它使用的是 RFC3339。这似乎与ISO8601的格式几乎相同。如果您能够使用该库,那么Joda Time恰好具有ISO8601 兼容。ISODateTimeFormat该方法dateTimeNoMillis()看起来与 Dojo 格式相匹配。它确实比标准的 Java 日期和时间 API 更好。否则,高咖啡因的建议将是可行的方法。

更新以响应 Jamen 的更新

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

于 2010-05-12T23:43:43.673 回答
2

在 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

于 2019-03-03T05:36:22.467 回答
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'});
}
于 2013-06-19T15:16:05.170 回答
1

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

只需检查我的最新问题的描述中介绍的实现,这也指向之前讨论过这个问题的那个。

于 2013-11-15T19:04:02.473 回答
1

我会从时区中删除“:”并使用上面的格式。

于 2010-05-12T23:28:45.177 回答