fork download
  1. import java.util.*;
  2. import java.util.regex.Pattern;
  3. import java.time.*;
  4. import java.time.format.*;
  5. import java.time.temporal.ChronoField;
  6.  
  7. class Ideone
  8. {
  9. private static final Locale RU = Locale.forLanguageTag("ru-RU");
  10. private static final Pattern MONTH_PATTERN
  11. = Pattern.compile("^\\d+ (\\w{3,5})\\.? \\d+$", Pattern.UNICODE_CHARACTER_CLASS);
  12. private static final Pattern NO_MONTH_PATTERN
  13. = Pattern.compile("^(\\d+) \\w{3,5}\\.? (\\d+)$", Pattern.UNICODE_CHARACTER_CLASS);
  14.  
  15. public static LocalDate parseSloppyRussianDate(String dateString) {
  16. String monthAbbr = MONTH_PATTERN.matcher(dateString).replaceFirst("$1");
  17. Month month = Arrays.stream(Month.values())
  18. .filter(m -> m.getDisplayName(TextStyle.FULL, RU).startsWith(monthAbbr))
  19. .findAny()
  20. .orElseThrow(() -> new DateTimeParseException("Unknown month", dateString, 3));
  21.  
  22. String withoutMonth = NO_MONTH_PATTERN.matcher(dateString).replaceFirst("$1 $2");
  23.  
  24. DateTimeFormatter dtf = new DateTimeFormatterBuilder()
  25. .appendPattern("d u")
  26. .parseDefaulting(ChronoField.MONTH_OF_YEAR, month.getValue())
  27. .toFormatter(RU);
  28.  
  29. return LocalDate.parse(withoutMonth, dtf);
  30. }
  31.  
  32. public static void main (String[] args) throws java.lang.Exception
  33. {
  34. System.out.println(parseSloppyRussianDate("27 апр. 2018"));
  35. System.out.println(parseSloppyRussianDate("24 мая. 2013"));
  36. System.out.println(parseSloppyRussianDate("28 фев. 2019"));
  37. }
  38.  
  39. }
Success #stdin #stdout 0.28s 55396KB
stdin
Standard input is empty
stdout
2018-04-27
2013-05-24
2019-02-28