我有一个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中。
只是为了完整性,有没有办法在日期格式表达式中指定忽略序列中的字符(不进行字符串操作/替换)?在这种情况下,我会说忽略任何':'或者只是忽略所有时区?
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;
}
}
}
这有效
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'格式说明符之后将格式中的最终冒号取出。)
RFC822不允许冒号位于日期的时区部分。它只需要4位数。该Dojo方法的名称表示它正在使用RFC3339。它似乎与ISO8601的格式几乎相同。恰好如果你能够使用该库,Joda Time有ISODateTimeFormat
与ISO8601兼容。方法dateTimeNoMillis()
看起来像是与Dojo格式的匹配。它确实比标准的Java日期和时间API更好。否则高度咖啡因的建议将是要走的路。
更新以回应Jamen的更新
难道没有办法让Dojo使用不包含时区的格式吗?然后,您可以调整Java端的格式以匹配。我对Dojo了解不多,但我找不到它提供的toRfc3339函数的任何文档。
我将':'从时区中剥离出来并使用上面的格式。
您可以使用自定义格式字符串创建自己的函数,而不是使用dojo.date.toRfc3339(jsDate)。
类似下面的内容会删除冒号,并且应该可以通过java格式进行解析。
function toRfc3339String(jsDate){
return dojo.date.locale.format(jsDate,{selector: 'date', datePattern:'yyyy-MM-dd\'T\'hh:mm:ssZ'});
}
你可以在没有Java 7的情况下做到这一点。我在2012年在StackOverflow
上提出了2个问题,所以有一个解决方案不需要任何第三方库。
只需检查我的latest question描述中提供的实现,这也指出了之前正在讨论此问题的实现。
在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