Presentar una fecha humano-leible en una API

Fechas en nuestras APIs

En nuestras APIs JSON hechas con Spring Boot muchas veces necesitamos que la información devuelta al hacer una petición GET sea transformada a un formato menos “técnico” por decirlo así y que sea más “humano”. En este post vamos a resolver el cambio de formato para las fechas de los entities de una manera muy sencilla.

A continuación el entity que estudiaremos:

package mx.edu.uaemex.fi.modelo;

import com.fasterxml.jackson.annotation.JsonFormat;

import javax.persistence.*;
import java.io.Serializable;
import java.util.Date;

@Entity
@Table(name = "membresias")
public class Membresia implements Serializable{
	
    ...

    @Column(name="fecha_expedicion")
    private Date fechaExpedicion;
    
    @Column(name="fecha_vencimiento")
    private Date fechaVencimiento;


	@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy", timezone = "America/Mexico_City")
	public Date getFechaExpedicion() {
		return fechaExpedicion;
	}

	public void setFechaExpedicion(Date fechaExpedicion) {
		this.fechaExpedicion = fechaExpedicion;
	}

	@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy", timezone = "America/Mexico_City")
	public Date getFechaVencimiento() {
		return fechaVencimiento;
	}

	public void setFechaVencimiento(Date fechaVencimiento) {
		this.fechaVencimiento = fechaVencimiento;
	}


	Membresia() {
		// Constructor
	  }
}

En nuestra base de datos tendríamos algo como lo siguiente:

fecha_expedicion fecha_vencimiento
2018-08-26 00:00:00 2018-09-26 00:00:00
2019-01-26 00:00:00 2020-01-26 00:00:00

Pero después de consultar nuestra API para esas membresías esperamos obtener algo similar a lo siguiente:

{
  "membresia": {
   	...
    "fechaExpedicion": "26-08-2018",
    "fechaVencimiento": "26-09-2018",
   	...
  }
}

En este ejemplo sólo utilizamos la anotación JsonFormat para los getters de nuestros atributos de tipo date, ya que para el insert no tenemos problemas y lo que buscamos es que el cliente de la API pueda tener los datos tal cual los va a presentar al usuario.

El parámetro timezone en la anotación JsonFormat

Puede que consideres que no es importante, pero es lo que realmente hace “que funcione”, no lo omitas o se puede comportar de manera rara, tampoco te recomiendo que utilices la zona horaria que tenga el servidor ya que no siempre son correctas. La siguiente es una lista de las zonas horarias que puedes utilizar:

America/Adak America/Anchorage America/Anguilla America/Antigua
America/Araguaina America/Argentina/Buenos_Aires America/Argentina/Catamarca America/Argentina/Cordoba
America/Argentina/Jujuy America/Argentina/La_Rioja America/Argentina/Mendoza America/Argentina/Rio_Gallegos
America/Argentina/Salta America/Argentina/San_Juan America/Argentina/San_Luis America/Argentina/Tucuman
America/Argentina/Ushuaia America/Aruba America/Asuncion America/Atikokan
America/Bahia America/Bahia_Banderas America/Barbados America/Belem
America/Belize America/Blanc-Sablon America/Boa_Vista America/Bogota
America/Boise America/Cambridge_Bay America/Campo_Grande America/Cancun
America/Caracas America/Cayenne America/Cayman America/Chicago
America/Chihuahua America/Costa_Rica America/Creston America/Cuiaba
America/Curacao America/Danmarkshavn America/Dawson America/Dawson_Creek
America/Denver America/Detroit America/Dominica America/Edmonton
America/Eirunepe America/El_Salvador America/Fort_Nelson America/Fortaleza
America/Glace_Bay America/Godthab America/Goose_Bay America/Grand_Turk
America/Grenada America/Guadeloupe America/Guatemala America/Guayaquil
America/Guyana America/Halifax America/Havana America/Hermosillo
America/Indiana/Indianapolis America/Indiana/Knox America/Indiana/Marengo America/Indiana/Petersburg
America/Indiana/Tell_City America/Indiana/Vevay America/Indiana/Vincennes America/Indiana/Winamac
America/Inuvik America/Iqaluit America/Jamaica America/Juneau
America/Kentucky/Louisville America/Kentucky/Monticello America/Kralendijk America/La_Paz
America/Lima America/Los_Angeles America/Lower_Princes America/Maceio
America/Managua America/Manaus America/Marigot America/Martinique
America/Matamoros America/Mazatlan America/Menominee America/Merida
America/Metlakatla America/Mexico_City America/Miquelon America/Moncton
America/Monterrey America/Montevideo America/Montserrat America/Nassau
America/New_York America/Nipigon America/Nome America/Noronha
America/North_Dakota/Beulah America/North_Dakota/Center America/North_Dakota/New_Salem America/Ojinaga
America/Panama America/Pangnirtung America/Paramaribo America/Phoenix
America/Port-au-Prince America/Port_of_Spain America/Porto_Velho America/Puerto_Rico
America/Punta_Arenas America/Rainy_River America/Rankin_Inlet America/Recife
America/Regina America/Resolute America/Rio_Branco America/Santarem
America/Santiago America/Santo_Domingo America/Sao_Paulo America/Scoresbysund
America/Sitka America/St_Barthelemy America/St_Johns America/St_Kitts
America/St_Lucia America/St_Thomas America/St_Vincent America/Swift_Current
America/Tegucigalpa America/Thule America/Thunder_Bay America/Tijuana
America/Toronto America/Tortola America/Vancouver America/Whitehorse
America/Winnipeg America/Yakutat America/Yellowknife
Europe/Amsterdam Europe/Andorra Europe/Astrakhan Europe/Athens
Europe/Belgrade Europe/Berlin Europe/Bratislava Europe/Brussels
Europe/Bucharest Europe/Budapest Europe/Busingen Europe/Chisinau
Europe/Copenhagen Europe/Dublin Europe/Gibraltar Europe/Guernsey
Europe/Helsinki Europe/Isle_of_Man Europe/Istanbul Europe/Jersey
Europe/Kaliningrad Europe/Kiev Europe/Kirov Europe/Lisbon
Europe/Ljubljana Europe/London Europe/Luxembourg Europe/Madrid
Europe/Malta Europe/Mariehamn Europe/Minsk Europe/Monaco
Europe/Moscow Europe/Oslo Europe/Paris Europe/Podgorica
Europe/Prague Europe/Riga Europe/Rome Europe/Samara
Europe/San_Marino Europe/Sarajevo Europe/Saratov Europe/Simferopol
Europe/Skopje Europe/Sofia Europe/Stockholm Europe/Tallinn
Europe/Tirane Europe/Ulyanovsk Europe/Uzhgorod Europe/Vaduz
Europe/Vatican Europe/Vienna Europe/Vilnius Europe/Volgograd
Europe/Warsaw Europe/Zagreb Europe/Zaporozhye Europe/Zurich

Espero que en algún momento les resulte útil a varios de ustedes. Como siempre, ¡para mi es un gusto!

¡Nos leemos pronto!

spring  api  json  entity  fecha 
comments powered by Disqus