java - Spring Boot Jackson fecha y formato de fecha y hora
spring-boot date (1)
En primer lugar, el método
Date.toString
genera resultados
Date.toString
y no debemos confiar en ello.
Ejemplo simple:
SimpleDateFormat dateToStringFormat = new SimpleDateFormat("EEE MMM dd HH:mm:ss Z yyyy", new Locale("us"));
Date parsed = dateToStringFormat.parse("Wed Mar 20 09:00:00 KST 2019");
System.out.println("Default toString: " + parsed);
dateToStringFormat.setTimeZone(TimeZone.getTimeZone("Asia/Seoul"));
System.out.println("With ''Asia/Seoul'' TZ: " + dateToStringFormat.format(parsed));
dateToStringFormat.setTimeZone(TimeZone.getTimeZone("Chile/Continental"));
System.out.println("With ''Chile/Continental'' TZ: " + dateToStringFormat.format(parsed));
huellas dactilares:
Default toString: Wed Mar 20 01:00:00 CET 2019
With ''Asia/Seoul'' TZ: Wed Mar 20 09:00:00 +0900 2019
With ''Chile/Continental'' TZ: Tue Mar 19 21:00:00 -0300 2019
Como puede ver, analicé su fecha de ejemplo el
Wed Mar 20 09:00:00 KST 2019
e
Wed Mar 20 09:00:00 KST 2019
usando el método
toString
y formateado con dos zonas horarias diferentes.
Entonces, todos ven la fecha combinada con su zona horaria.
Leer más sobre:
- Java Date toString contiene una zona horaria ... ¿Por qué?
- Análisis de una fecha java desde toString ()
No podemos definir patrones de fecha en la configuración como usted propuso.
Vea las
opciones de configuración de
Jackson
disponibles
aquí
.
Puede configurar el formato utilizando la anotación
com.fasterxml.jackson.annotation.JsonFormat
.
Ya que
Java 8
está disponible, deberíamos usar las clases
java.time.*
Para las propiedades relacionadas con el tiempo.
Ejemplo de clase
POJO
podría gustar esto:
import com.fasterxml.jackson.annotation.JsonFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.MonthDay;
public class RequestPayload {
@JsonFormat(pattern = "MM/dd")
private MonthDay md;
@JsonFormat(pattern = "yyyy-MM-dd")
private LocalDate date;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime dateTime;
// getters, setters, toString
}
Para que funcione, necesitamos registrar el módulo
JavaTimeModule
:
@Bean
public Jackson2ObjectMapperBuilder objectMapperBuilder() {
Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
builder.modules(new JavaTimeModule());
return builder;
}
Si puede cambiar sus propiedades de
Bean
a
java.time.*
clases simplemente propagan estas fechas de
Controller
a
DB
.
En otro caso, vea esta pregunta:
Conversión entre java.time.LocalDateTime y java.util.Date
.
configuración de
application.yml
:
jackson:
date-format: yyyy-MM-dd
timestamp-format:yyyy-MM-dd HH:mm:ss
serialization:
write-dates-as-timestamps: false
Propiedades del frijol:
@Entity
@Column(nullable = false)
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Temporal(TemporalType.DATE)
private Date date_created;
@Column(nullable = false)
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Temporal(TemporalType.TIMESTAMP)
private Date reg_date;
Configuré todos los campos de
Date
como
java.util.Date
fecha que recibió la fecha en formato
yyyy-MM-dd
y tipo de marca de hora (
yyyy-MM-dd HH:mm:ss
) de acuerdo con el estilo param de solicitud (
yyyy-MM-dd
o
yyyy-MM-dd HH:mm:ss
)
Para usar la
timestamp
, encontré @Temporal (
TemporalType.Date
o
Timestamp
) que se asigna por
DB Type
.
El formato de fecha y hora se almacena correctamente como
yyyy-MM-dd
o
yyyy-MM-dd HH:mm:ss.sss
Clase
RestController
:
@PostMapping("/")
public ResponseEntity<Object> create(@RequestBody CreateVO createVO, HttpServletRequest request) {
System.out.println("planned_date> "+createVO.getDate_planned_start());
System.out.println("regdate> "+createVO.getReg_date());
}
Se establecen en:
planned_date> Wed Mar 20 09:00:00 KST 2019 // Date Result
regdate> Mon Oct 01 16:45:00 KST 2012 //Timestamp Result
Sin embargo, recibo en RestController
Date
en un formato diferente al que esperaba.
¿Hay alguna solución para recibir
yyyy-MM-dd
y
yyyy-MM-dd HH:mm:ss
en el
Controller
?
Me estoy preguntando acerca de la configuración de
application.yml
también.
Porque no estoy seguro de cómo configurar el formato de marca de tiempo.