Переход от SimpleDateFormat к DateTimeFormater: дополнительный ввод

#java #date #datetimeformatter

Вопрос:

Я переношу какой-то старый код из 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

Заранее благодарю вас за вашу помощь!

Комментарии:

1. Что именно представляют собой эти дополнительные символы, не могли бы вы пояснить свой пример? Это слово «Дата» , или у вас есть 2 копии даты или…?

Ответ №1:

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/2021amp;amp;";
        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

Ответ №2:

RFC_5322.разбор(тело, новая парсепозиция(0)) решил эту проблему…