J'ai une entité avec des champs Dates (java.util.Date) définis de cette façon:
{"id":1,"tipoPlanId":320,"precio":155000.0, "cantidad":6,"fechaInicio":1546300800000,"fechaFin":1551312000000}
J'ai RestController pour obtenir les entités, le problème est le format que j'obtiens est en millisecondes pour les dates:
@Temporal(TemporalType.TIMESTAMP) private Date fechaInicio; @Temporal(TemporalType.TIMESTAMP) private Date fechaFin;
Je ne sais pas pourquoi ne renvoie pas le format de date par défaut pour le repos des données de printemps : 15: 16.000 + 0000 "
Merci pour votre aide.
4 Réponses :
Ma seule idée est de la convertir en une date lisible par un humain comme celle-ci:
SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss.SSS"); String humanReadableDate = sdf.format(fechaFin);
Vous pouvez le modifier dans le getter de classe lorsque Spring récupère les champs et méthodes publics, ou le stocker comme TemporalType.DATE.
J'utilise Spring 2.x et pour moi Date
est renvoyée dans le format approprié.
Cependant, vous pouvez également l'appliquer en:
spring.jackson.serialization.write-dates-as-timestamps = false
dans votre fichier de propriétés @JsonFormat (shape = JsonFormat.Shape.STRING, pattern = "aaaa-MM-jj HH: mm: ss")
Donc, dans votre cas, la classe sera comme:
@Temporal(TemporalType.TIMESTAMP) @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss") private Date fechaInicio; @Temporal(TemporalType.TIMESTAMP) @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss") private Date fechaFin;
Tout d'abord, je recommande fortement d'utiliser java.time.LocalDateTime / java.time.LocalDate au lieu de java.util.Date (la gestion des fuseaux horaires est un cauchemar lors de l'utilisation de java.util.Date et vous pourriez finir par une mauvaise insertion date / heure dans votre base de données), le formatage de la date à l'aide de @JsonFormat peut résoudre le problème de format uniquement, mais vous pouvez faire face à des écarts de données lors du traitement de la valeur de date / horodatage.
Si vous utilisez SpringBoot, un formateur enregistré dans Spring Context est utilisé pour gérer LocalDate / LocalDateTime et vous pouvez utiliser ce type de données sans apporter de modification à votre configuration.
Maintenant, si vous n'utilisez pas Spring Boot, vous devrez peut-être enregistrer le formateur LocalDate / LocalDateTime dans votre configuration (voir ce post Comment enregistrer une liaison de données globale pour LocalDate dans spring mvc? , veuillez noter que vous devez enregistrer le type LocalDateTime pour horodatages )
Le traitement de la date / de l'horodatage n'est pas une chose triviale dans Rest / Spring, mais croyez-moi si vous implémentez LocalDate ou LocalDateTime, vous ne vous casserez pas la tête en essayant de découvrir ce qui ne va pas avec certaines dates / horodatages insérés avec des valeurs incorrectes dans la base de données.
Exemples de classes
DTO
@RestController @RequestMapping("/chocolateCookies") public class ChocolateCookieApi extends CookieApi<ChocolateCookie> { @GetMapping("/{cookieId}") public ResponseEntity<Cookie> findCookie(@PathVariable long cookieId) { final Cookie cookie = new Cookie(); cookie.setId(cookieId); cookie.setExpirationDate(LocalDateTime.now().plusWeeks(4)); return new ResponseEntity<>(cookie, HttpStatus.OK); } //Other cookie stuff }
Contrôleur
public class Cookie { private long id; private LocalDateTime expirationDate; //Getters/setters and other stuff }
Point final test
Code disponible dans GitHub https://github.com/karl-codes/cookie-monster
Bon codage!