Использование DateTimeFormatterBuilder
для получения DateTimeFormatter
, как , предложенное от vmrvictor .
Имейте в виду, что форматер может использоваться как для генерации текста, так и для синтаксического анализа.
private static final DateTimeFormatter formatter =
new DateTimeFormatterBuilder()
.appendValue(YEAR)
.optionalStart()
.appendLiteral('-')
.appendValue(MONTH_OF_YEAR)
.optionalStart()
.appendLiteral('-')
.appendValue(DAY_OF_MONTH)
.optionalStart()
.appendLiteral(' ')
.appendValue(HOUR_OF_DAY)
.optionalEnd()
.optionalEnd()
.optionalEnd()
.parseDefaulting(MONTH_OF_YEAR, 1)
.parseDefaulting(DAY_OF_MONTH, 1)
.parseDefaulting(HOUR_OF_DAY, 0)
.parseDefaulting(MINUTE_OF_HOUR, 0)
.parseDefaulting(SECOND_OF_MINUTE, 0)
.toFormatter();
private static LocalDateTime convert(String text) {
return LocalDateTime.parse(text, formatter);
}
Возвращенный объект LocalDateTime
может быть отформатирован по желанию, но я предположил, что 2019-01-01 00:00:00
в вопросе указывает на объект, по сравнению с "2019"
, который представляет строку.
Результаты для данных:
"2019" -> 2019-01-01 00:00:00
"2019-02" -> 2019-02-01 00:00:00
"2019-06-02" -> 2019-06-02 00:00:00
"2019-07-2 11" -> 2019-07-02 11:00:00
Вот рабочий тестовый класс, использующий JUnit 5 Jupiter.
package work.basil.example;
import org.junit.jupiter.api.Test;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import static java.time.temporal.ChronoField.*;
import static org.junit.jupiter.api.Assertions.*;
public class AppTest
{
private static final DateTimeFormatter formatterInput =
new DateTimeFormatterBuilder ()
.appendValue ( YEAR )
.optionalStart ()
.appendLiteral ( '-' )
.appendValue ( MONTH_OF_YEAR )
.optionalStart ()
.appendLiteral ( '-' )
.appendValue ( DAY_OF_MONTH )
.optionalStart ()
.appendLiteral ( ' ' )
.appendValue ( HOUR_OF_DAY )
.optionalEnd ()
.optionalEnd ()
.optionalEnd ()
.parseDefaulting ( MONTH_OF_YEAR , 1 )
.parseDefaulting ( DAY_OF_MONTH , 1 )
.parseDefaulting ( HOUR_OF_DAY , 0 )
.parseDefaulting ( MINUTE_OF_HOUR , 0 )
.parseDefaulting ( SECOND_OF_MINUTE , 0 )
.toFormatter ();
private static final DateTimeFormatter formatterOutput = DateTimeFormatter.ofPattern ( "uuuu-MM-dd HH:mm:ss" );
@Test
public void testFormatter ( )
{
assertEquals ( "2019-01-01 00:00:00" , LocalDateTime.parse ( "2019" , AppTest.formatterInput ).format ( AppTest.formatterOutput ) );
assertEquals ( "2019-02-01 00:00:00" , LocalDateTime.parse ( "2019-02" , AppTest.formatterInput ).format ( AppTest.formatterOutput ) );
assertEquals ( "2019-06-02 00:00:00" , LocalDateTime.parse ( "2019-06-02" , AppTest.formatterInput ).format ( AppTest.formatterOutput ) );
assertEquals ( "2019-07-02 11:00:00" , LocalDateTime.parse ( "2019-07-2 11" , AppTest.formatterInput ).format ( AppTest.formatterOutput ) );
}
}