Jackson (2): problemas con el formato de hora y la zona horaria de @JsonFormat

1. Descripción

Hoy encontré un problema que ha sido verificado durante mucho tiempo. El rendimiento específico es que la zona horaria del parámetro de tiempo pasado desde el front-end es + 0800. Cuando uso Jackson para deserializarlo en un objeto, el análisis de tiempo es sigue siendo correcto, pero luego serializo el objeto en Json La zona horaria de la hora de los datos ha cambiado a la zona horaria +0000 nuevamente, lo que causa problemas en la interfaz, pero la zona horaria también es correcta cuando se ve en el servidor con el comando fecha. Después de resolverlo, registre la solución aquí.

1.1 @JsonFormat

Propósito : indica un formato o tipo de serialización json, que a menudo se usa para convertir formatos de hora.
Uso : @JsonInclude (patrón = formato de fecha, zona horaria = el valor predeterminado es GMT, East Eight District necesita usar GMT + 8. valor).
(Solo explique la conversión del formato de tiempo)

dos, ejemplos

2.1 Operación

Datos de prueba:

  {
  "time1": "2022-09-16T16:26:48+0800",
  "time2": "2022-09-16T16:27:48+0800"
  }

clase de entidad

@JsonIgnoreProperties(ignoreUnknown = true)
@Getter
@Setter
@ToString
public class Body{
    
    
  @JsonFormat(pattern = Serializer.DATE_FORMAT, timezone = "GMT+8")
  private Date time1;
  @JsonFormat(pattern = Serializer.DATE_FORMAT, timezone = "GMT+8")
  private Date time2;

Una clase que encapsula a Jackson

public class Serializer{
    
    
  public static final String DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ssZ";
  private final ObjectMapper mapper = new ObjectMapper();

  public Serializer() {
    
    
    mapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);
  }
  public Date decodeTime(String str) throws SkyLinkException {
    
    
    if (str == null || str.isEmpty()) {
    
    
      return null;
    }
    SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT);
    try {
    
    
      return sdf.parse(str);
    } catch (ParseException e) {
    
    
      throw new SkyLinkException(e);
    }
  }

  public String encodeTime(Date date) throws SkyLinkException {
    
    
    if (date != null) {
    
    
      SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT);
      return sdf.format(date);
    }
    return null;
  }
  
  public <T> String encode(T obj) throws SkyLinkException {
    
    
    try {
    
    
      return mapper.writeValueAsString(obj);
    } catch (JsonProcessingException e) {
    
    
      throw new SkyLinkException(e);
    }
  }

  public <T> T decode(String json, Class<T> cls) throws SkyLinkException {
    
    
    try {
    
    
      return mapper.readValue(json, cls);
    } catch (IOException e) {
    
    
      throw new SkyLinkException(e);
    }
  }

Explicación: si la zona horaria = "GMT+8" no se agrega a la hora 1 y la hora 2 de la clase Body aquí, luego de llamar a la codificación de la clase Serializer, el resultado de la hora 1 y la hora 2 se convierte en 2022-09-16T8:26:48 + 0000.

Guess you like

Origin blog.csdn.net/weixin_42717117/article/details/126892612