用JAVA语言解析RFC 2822数据

xeufq47z  于 2022-12-21  发布在  Java
关注(0)|答案(7)|浏览(156)

我需要解析一个用Java表示的日期的RFC 2822字符串。下面是一个示例字符串:
2010年3月13日星期六11:29:05 - 08:00
它看起来很讨厌,所以我想确保我做的每件事都是正确的,并会遇到奇怪的问题后,日期被解释错误,无论是通过上午-下午/军事时间的问题,UTC时间的问题,我没有预料到的问题,等等...
谢谢!

bttbmeg0

bttbmeg01#

这是一段快速代码,可以完成您的请求(使用**SimpleDateFormat**)

String rfcDate = "Sat, 13 Mar 2010 11:29:05 -0800";
String pattern = "EEE, dd MMM yyyy HH:mm:ss Z";
SimpleDateFormat format = new SimpleDateFormat(pattern);
Date javaDate = format.parse(rfcDate);

//Done.

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

rt4zxlrg

rt4zxlrg2#

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

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

23c0lvtd3#

请记住,[day-of-week“,"]在RFC-2822中是可选的,因此建议的示例并不涵盖所有RFC-2822日期格式。此外,RFC-822日期类型允许许多不同的时区表示法(obs-zone),“Z”格式说明符不涵盖这些表示法。
我想没有简单的出路,除了寻找“,”和“-|+”以确定使用哪个模式。

58wvjzkj

58wvjzkj4#

一个月

自从Java 8新的datetime类实现以来:java.time.ZonedDateTimejava.time.LocalDateTimeZonedDateTime支持几乎开箱即用的RFC字符串解析:

String rfcDate = "Tue, 4 Dec 2018 17:37:31 +0100 (CET)";  
if (rfcDate.matches(".*[ ]\\(\\w\\w\\w\\)$")) {
    //Brackets with time zone are added sometimes, for example by JavaMail
    //This must be removed before parsing
    //from: "Tue, 4 Dec 2018 17:37:31 +0100 (CET)"
    //  to: "Tue, 4 Dec 2018 17:37:31 +0100"
    rfcDate = rfcDate.substring(0, rfcDate.length() - 6);
}

//and now parsing... 
DateTimeFormatter dateFormat = DateTimeFormatter.RFC_1123_DATE_TIME;
try {
    ZonedDateTime zoned = ZonedDateTime.parse(rfcDate, dateFormat);
    LocalDateTime local = zoned.toLocalDateTime();        
} catch (DateTimeParseException e) { ... }
wribegjk

wribegjk5#

有一个javax.mail类执行RFC-2822日期的解析:
javax.mail.internet.MailDateFormat
包括可选的和过时的格式。
只需:

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日期
对于其他旧的DateFormatter,MailDateFormat类不是线程安全的。

mnowg1ta

mnowg1ta6#

RFC 2822日期-时间字符串包含时区偏移量,例如,给定字符串 * Sat,13 Mar 2010 11:29:05 -0800 * 与UTC的时区偏移量为-08:00小时,即UTC的等效日期-时间可以通过将8小时添加到 * Sat,13 Mar 2010 11:29:05 * 来获得。

Java.时间

modern date-time API API使用OffsetDateTime表示带有时区偏移的日期-时间。

import java.time.OffsetDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

class Main {
    public static void main(String[] args) {
        String strRFC2822DateTimeStr = "Sat, 13 Mar 2010 11:29:05 -0800";

        OffsetDateTime odt = OffsetDateTime.parse(strRFC2822DateTimeStr, DateTimeFormatter.RFC_1123_DATE_TIME);
        System.out.println(odt);

        // Alternatively: using a custom DateTimeFormatter
        DateTimeFormatter parser = DateTimeFormatter.ofPattern("EEE, dd MMM uuuu HH:mm:ss XX", Locale.ENGLISH);
        System.out.println(OffsetDateTime.parse(strRFC2822DateTimeStr, parser));

        // In case you need the equivalent date-time at UTC
        OffsetDateTime odtUtc = odt.withOffsetSameInstant(ZoneOffset.UTC);
        System.out.println(odtUtc);
    }
}
    • 输出**:
2010-03-13T11:29:05-08:00
2010-03-13T11:29:05-08:00
2010-03-13T19:29:05Z

从**Trail: Date Time**了解有关现代日期-时间API的更多信息。

    • 一些有用的链接**:
  1. Never use SimpleDateFormat or DateTimeFormatter without a Locale.
    1.您可以使用y代替u,但可以使用I prefer u to y
  2. How to use OffsetDateTime with JDBC.
c6ubokkw

c6ubokkw7#

试试这个:

String dateTime = OffsetDateTime.now().format(DateTimeFormatter.RFC_1123_DATE_TIME); 
//RFC_1123 == RFC_2822

相关问题