Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用JAVA解析RFC2822日期_Java_Date_Parsing_Rfc2822 - Fatal编程技术网

用JAVA解析RFC2822日期

用JAVA解析RFC2822日期,java,date,parsing,rfc2822,Java,Date,Parsing,Rfc2822,我需要解析Java中日期的RFC2822字符串表示形式。下面是一个示例字符串: 2010年3月13日星期六11:29:05-0800 它看起来很糟糕,所以我想确保我做的每件事都是正确的,并且在以后会遇到奇怪的问题,因为日期被错误地解释为AM-PM/军事时间问题、UTC时间问题、我没有预料到的问题等等 谢谢 这是一个快速代码,可以满足您的要求(使用) 另外,我在这里没有处理异常和并发(因为解析日期时SimpleDataFormat不同步)。如果您的应用程序使用的是英语以外的其他语言,您可能希望使用

我需要解析Java中日期的RFC2822字符串表示形式。下面是一个示例字符串:

2010年3月13日星期六11:29:05-0800

它看起来很糟糕,所以我想确保我做的每件事都是正确的,并且在以后会遇到奇怪的问题,因为日期被错误地解释为AM-PM/军事时间问题、UTC时间问题、我没有预料到的问题等等


谢谢

这是一个快速代码,可以满足您的要求(使用


另外,我在这里没有处理异常和并发(因为解析日期时SimpleDataFormat不同步)。

如果您的应用程序使用的是英语以外的其他语言,您可能希望使用另一个SimpleDataFormat构造函数强制进行日期解析/格式化的区域设置:

String pattern = "EEE, dd MMM yyyy HH:mm:ss Z";
SimpleDateFormat format = new SimpleDateFormat(pattern, Locale.ENGLISH);

请记住,[星期几“,”]在RFC-2822中是可选的,因此建议的示例并不涵盖所有RFC-2822日期格式。此外,RFC-822日期类型允许许多不同的时区符号(obs区域),而“Z”格式说明符不包括这些符号

我想除了寻找“,”和“-+”来确定使用哪种模式之外,没有简单的解决办法。

DateTimeFormatter.RFC\u 1123\u DATE\u TIME
自从Java实现了8个新的日期时间类:
Java.time.ZonedDateTime
Java.time.LocalDateTime
ZonedDateTime
支持几乎开箱即用的RFC字符串解析:

String rfcDate=“2018年12月4日星期二17:37:31+0100(CET)”;
if(rfcDate.matches(“.[]\\(\\w\\w\\w\\)$”){
//有时会添加带时区的括号,例如JavaMail
//必须在解析之前删除此项
//发件人:“2018年12月4日星期二17:37:31+0100(CET)”
//致:“2018年12月4日星期二17:37:31+0100”
rfcDate=rfcDate.substring(0,rfcDate.length()-6);
}
//现在分析。。。
DateTimeFormatter dateFormat=DateTimeFormatter.RFC_1123_DATE_TIME;
试一试{
ZonedDateTime zoned=ZonedDateTime.parse(rfcDate,dateFormat);
LocalDateTime local=zoned.toLocalDateTime();
}捕获(DateTimeParseException){…}

有一个javax.mail类,用于解析RFC-2822日期:

包括可选和过时的格式

只要做:

new javax.mail.internet.MailDateFormat().parse("Sat, 13 Mar 2010 11:29:00 -0800")
new javax.mail.internet.MailDateFormat().parse("13 Mar 2010 11:29:00 -0800")
new javax.mail.internet.MailDateFormat().parse("13 Mar 2010 11:29 -0800")
它将正确解析这些有效的RFC-2822日期


至于其他旧的日期格式化程序,
MailDateFormat
类不是线程安全的。

您是否尝试过使用
java.text.SimpleDateFormat
?这似乎是正确的使用方法,我也担心正确的格式字符串是什么,它看起来很容易出错。这似乎是RFC 2822的正确字符串:“EEE,d MMM yyy HH:mm:ss Z”(根据下面的答案)这太疯狂了,我从官方的SimpleDateFormat页面上删除了它。他们的例子在技术上是正确的,但仍然是错误的:谢谢你们给了我一个提示,这就是我的代码。标准的来源:,向下滚动到第3.3节。日期和时间规范。必须设置区域设置。android javadoc for Locale建议使用Locale.US进行计算机间通信+1 Locale.ROOT也是一个不错的选择,但并非在所有系统上都可用。@jasongilbert您能解释一下为什么您说Locale“绝对是必需的”吗?根据文档,它不是:--但也许你的意思是“如果…”需要,它是我感兴趣的“如果…”的延续…@AdamTuttle如果你想在默认语言环境不是美国英语的情况下正确解析日期,它是必需的。例如,如果用户在德国,则日期将不能正确解析为其默认区域设置。+1用于指出星期几是可选的。我正在建立一个包含各种模式的try/catch瀑布,以不断尝试各种变化,直到找到一个可行的变化。不仅
一周中的一天
是可选的,而且一天中的秒数也被声明为可选的:
一天中的时间=小时“:“分钟[”:“秒]
使用此链接获取最新的可接受值,这个答案现在已经过时了。多年前,JSR 310中定义的现代java.time类取代了
SimpleDataFormat
Date
类。请参阅。解析的好答案。但我不建议将
ZonedDateTime
转换为
LocalDateTime
。在这样做的过程中,你正在丢弃有价值的信息,即时区,而没有任何回报。与没有特定货币上下文的货币量一样,
LocalDateTime
是不明确的,因此不能代表一个时刻。
new javax.mail.internet.MailDateFormat().parse("Sat, 13 Mar 2010 11:29:00 -0800")
new javax.mail.internet.MailDateFormat().parse("13 Mar 2010 11:29:00 -0800")
new javax.mail.internet.MailDateFormat().parse("13 Mar 2010 11:29 -0800")