Bienvenido a nuestro sitio web, en este lugar hallarás la respuesta de lo que andabas buscando.
Solución:
Necesitarías construir un formateador con una fracción específica
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.appendPattern("yyyy-MM-dd HH:mm:ss")
.appendFraction(ChronoField.MILLI_OF_SECOND, 2, 3, true) // min 2 max 3
.toFormatter();
LocalDateTime formatDateTime = LocalDateTime.parse(date, formatter);
Las respuestas de Basil Bourque y Sleiman Jneidi son excelentes. Solo quería señalar que la respuesta de EMH333 también tiene un punto: la siguiente modificación muy simple del código en la pregunta resuelve su problema.
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.[SSS][SS]");
El corchete en el patrón de formato string incluya partes opcionales, por lo que acepta 3 o 2 decimales en la fracción de segundos.
- Ventaja potencial sobre la respuesta de Basil Bourque: brinda una mejor validación de entrada, objetará si solo hay 1 o si hay cuatro decimales en los segundos (si esto es una ventaja depende completamente de su situación).
- Ventaja sobre la respuesta de Sleiman Jneidi: no necesita el constructor.
Posible inconveniente: no acepta decimales en absoluto (siempre que el punto decimal esté allí).
Como dije, las otras soluciones también son muy buenas. Cuál prefieres es principalmente una cuestión de gusto.
tl; dr
No es necesario definir un formateador en absoluto.
LocalDateTime.parse(
"2017-11-21 18:11:14.05".replace( " " , "T" )
)
ISO 8601
The Answer de Sleiman Jneidi es especialmente inteligente y de alta tecnología, pero hay una forma más sencilla.
Ajusta tu entrada string para cumplir con el formato ISO 8601, el formato utilizado por defecto en las clases java.time. Por lo tanto, no es necesario especificar un patrón de formato en absoluto. El formateador predeterminado puede manejar cualquier número de dígitos decimales entre cero (segundos enteros) y nueve (nanosegundos) para la fracción de segundo.
Su entrada es casi compatible. Simplemente reemplace el ESPACIO en el medio con unT
.
String input = "2017-11-21 18:11:14.05".replace( " " , "T" );
LocalDateTime ldt = LocalDateTime.parse( input );
ldt.toString(): 2017-11-21T18:11:14.050
Te invitamos a asistir nuestro trabajo mostrando un comentario y dejando una puntuación te damos la bienvenida.