#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
Ответ №2:
RFC_5322.разбор(тело, новая парсепозиция(0)) решил эту проблему…