Как преобразовать неформатированную строку в объект даты и времени в Java?

Группа наших файлов миграции sql названа в соответствии с соглашением «V201801011200__migration.sql», и мне было поручено написать java-метод для выбора последней миграции. Я хочу сделать это, проанализировав «201801011200» в Java Datetime (или другом подобном объекте, если формат этой строки не поддерживается Datetime).

Как бы я это сделал? Обратите внимание, что я не могу переименовать эти файлы миграции в «2018-01-01-12: 00» и т. д.

Отсутствие дефисов или двоеточий не означает, что они не отформатированы. Они просто отформатированы без дефисов и двоеточий.

Joe C 11.04.2018 00:02

То есть при условии, что все они пронумерованы одинаково.

Tripp Kinetics 11.04.2018 00:27

Зачем вам нужно анализировать дату, чтобы найти последнюю? В данном формате (yyyyMMddHHmm) сам текст упорядочен так же, как даты, т.е. более поздняя дата является более поздним алфавитным текстом. Так что просто найдите файл с последним алфавитным именем. Разбор даты - это излишне.

Andreas 11.04.2018 00:28

Помимо простой сортировки имен файлов, есть пара опций: (1) Разобрать LocalDateTime с помощью DateTimeFormatter.ofPattern("'V'uuuuMMddHHmm__'migration.sql‌​'"). (2) Выберите дату и время из имени файла с помощью регулярного выражения, а затем выполните синтаксический анализ с помощью средства форматирования даты и времени, которое не включает V и migration.sql.

Ole V.V. 11.04.2018 05:59
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
4
646
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Простая строка-время будет:

String timeString = "201801011200";
SimpleDateFormat timeStringFormat = new SimpleDateFormat( "yyyyMMddHHmm" ) ;
Date time = timeStringFormat.parse(timeString);
System.out.println(time) ;

Пожалуйста, не учите молодых пользоваться SimpleDateFormat. Этот класс не только давно устарел, но и доставляет немало хлопот. Сегодня у нас намного лучше java.time, современный API даты и времени Java и его класс DateTimeFormatter.

Ole V.V. 11.04.2018 05:52

Не все используют Java 8 или новейшие технологии :)

Marvin 11.04.2018 09:45

Верно, @Marvin. Для Java 6 и 7 используйте ThreeTen Backport, он предлагает функциональность java.time. Если вы хотите представить решение для Java 5, прекрасно, но, пожалуйста, сообщите нам, что это именно то, что есть, чтобы никто не подумал, что это решение, которое они должны использовать с более современными версиями Java. Пожалуйста.

Ole V.V. 11.04.2018 09:49
If you need java Date object use SimpleDateFormat:

SimpleDateFormat inputFormat = new SimpleDateFormat("yyyyMMddHHmm");
SimpleDateFormat outputFormat = new SimpleDateFormat("yyyy-MM-dd-HH:mm");
java.util.Date javaDate = inputFormat.parse("201801011200");
System.out.println("java.util.Date = " + javaDate);
System.out.println("output string = " + outputFormat.format(javaDate));

Если вам нужно просто переформатировать строку, используйте StringBuilder

String outputString = new StringBuilder("201801011200").
                insert(4, "-").
                  insert(7, "-").
                    insert(10, "-").
                      insert(13, ":").toString();
System.out.println("output string = " +outputString);

Пожалуйста, не учите молодых пользоваться SimpleDateFormat. Этот класс не только давно устарел, но и доставляет немало хлопот. Сегодня у нас намного лучше java.time, современный API даты и времени Java и его класс DateTimeFormatter.

Ole V.V. 11.04.2018 05:52

Он по-прежнему хорошо работает, если вы знаете, что такое java.util.Date и как с ним правильно работать. Итак ... где твой ответ?

Vadim 11.04.2018 18:28

Есть прекрасные ответы java.time, например здесь и здесь.

Ole V.V. 11.04.2018 18:32

Другие вопросы по теме