1

我正在将一些旧代码从 SimpleDateFormat 迁移到 DateTimeFormatter。(Apache MIME4J 库,它将释放显着的性能提升!)

在电子邮件领域工作,我需要遵守 RFC-5322 并提出以下格式化程序:

    public static final DateTimeFormatter RFC_5322 = new DateTimeFormatterBuilder()
        .parseCaseInsensitive()
        .parseLenient()
        .optionalStart()
            .appendText(DAY_OF_WEEK, dayOfWeek())
            .appendLiteral(", ")
        .optionalEnd()
        .appendValue(DAY_OF_MONTH, 1, 2, SignStyle.NOT_NEGATIVE)
        .appendLiteral(' ')
        .appendText(MONTH_OF_YEAR, monthOfYear())
        .appendLiteral(' ')
        .appendValueReduced(YEAR, 2, 4, INITIAL_YEAR)
        .appendLiteral(' ')
        .appendValue(HOUR_OF_DAY, 2)
        .appendLiteral(':')
        .appendValue(MINUTE_OF_HOUR, 2)
        .optionalStart()
            .appendLiteral(':')
            .appendValue(SECOND_OF_MINUTE, 2)
        .optionalEnd()
        .optionalStart()
            .appendLiteral('.')
            .appendValue(MILLI_OF_SECOND, 3)
        .optionalEnd()
        .optionalStart()
            .appendLiteral(' ')
            .appendOffset("+HHMM", "GMT")
        .optionalEnd()
        .optionalStart()
            .appendLiteral(' ')
            .appendOffsetId()
        .optionalEnd()
        .optionalStart()
            .appendLiteral(' ')
            .appendPattern("0000")
        .optionalEnd()
        .optionalStart()
            .appendLiteral(' ')
            .appendPattern("(zzz)")
        .optionalEnd()
        .toFormatter()
        .withZone(ZoneId.of("GMT"));

这适用于像Thu, 4 Oct 2001 20:12:26 -0700 (PDT).

但是,一些边界电子邮件在: 之后会有额外的字符,Date: Thu, 4 Oct 2001 20:12:26 -0700 (PDT),Thu, 4 Oct 2001 20:12:26 -0700并导致解析失败......

我想要某种通配符来表示“现在你可以自由地忽略额外的输入”......

基于 SimpleDateFormat 的先前版本很好地处理了这个......

这是拉取请求的链接:https ://github.com/apache/james-mime4j/pull/44

预先感谢您的帮助!

4

2 回答 2

2

DateTimeFormatter#parse(CharSequence, ParsePosition)随时为您服务。

演示:

import java.text.ParsePosition;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        String s = "08/01/2021&&";
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("MM/dd/uuuu", Locale.ENGLISH);
        LocalDate date = LocalDate.from(dtf.parse(s, new ParsePosition(0)));
        System.out.println(date);
    }
}

输出:

2021-08-01

ONLINE DEMO

于 2021-06-17T09:29:28.747 回答
0

RFC_5322.parse(body, new ParsePosition(0)) 解决了这个问题......

于 2021-06-17T09:26:13.117 回答