Pattern pattern = Pattern.compile("\\d{8}");
String sourceString = "20180808";
Matcher matcher = pattern.matcher(sourceString);
while (matcher.find()) {
LocalDate date = LocalDate.parse(matcher.group(), DateTimeFormatter.BASIC_ISO_DATE);
System.out.println(date);
}
Выходные данные из этого фрагмента - ожидаемая дата:
2018-08-08
Если ваша строка может содержать больше текста, чем просто 8-значная дата, правильно использовать регулярное выражение для удаления этих 8-значных цифр. Правильный класс для даты - LocalDate
из java.time, современного Java-API даты и времени. это дата в календарной системе ISO без времени суток и без часового пояса. Calendar
, напротив, представляет дату и время с часовым поясом в некоторой календарной системе. Это гораздо больше, чем вам нужно. Также класс Calendar
давно устарел и был заменен java.time четыре с половиной года назад, потому что он был плохо спроектирован.
Если вам нужен объект Calendar
для какого-либо устаревшего API, который вы не можете изменить или не хотите изменять прямо сейчас, выполните преобразование следующим образом:
ZoneId zone = ZoneId.of("America/Punta_Arenas");
ZonedDateTime startOfDay = date.atStartOfDay(zone);
Calendar cal = GregorianCalendar.from(startOfDay);
Пожалуйста, укажите правильный часовой пояс, если это не Америка / Punta_Arenas.
Что пошло не так в вашем коде?
В вашем коде нет ничего плохого, кроме того, что он слишком сложен и использует устаревшие классы даты и времени.
String patternString = "(\\d{4})(\\d{2})(\\d{2})";
Pattern pattern = null;
Matcher matcher = null;
try {
pattern = Pattern.compile(patternString, Pattern.CASE_INSENSITIVE);
matcher = pattern.matcher(sourceString);
while (matcher.find()) {
System.out.println("group(1): " + matcher.group(1));
System.out.println("group(2): " + matcher.group(2));
System.out.println("group(3): " + matcher.group(3));
}
} catch (Exception e) {
// TODO handle exception
throw e;
}
Вывод этого фрагмента:
group(1): 2018
group(2): 08
group(3): 08
Link
Учебное пособие по Oracle: Дата и время , объясняющее, как использовать java.time
.