3 метода форматирования глобального времени Springboot, прекратите писать повторяющиеся коды

Java задняя часть
3 метода форматирования глобального времени Springboot, прекратите писать повторяющиеся коды
"

Эта статья размещена в личном блоге:www.chengxy-nds.top, обмен техническими данными, с прогрессом

"

Форматирование времени очень часто используется в проектах, когдаAPIИнтерфейс возвращает результат, один из которых нужноdateСвойства поля специально отформатированы, обычно используютсяSimpleDateFormatОбращение с инструментом.

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
Date stationTime = dateFormat.parse(dateFormat.format(PayEndTime()));

Но как только появляется больше мест, с которыми нужно иметь дело, не толькоCVОперации выполняются часто, и генерируется много повторяющихся и раздутых кодов.В настоящее время, если формат времени можно настроить единообразно, можно сэкономить больше времени, чтобы сосредоточиться на развитии бизнеса.

Может быть, многие думают, что отформатировать время единообразно очень просто, достаточно настроить его следующим образом, но на самом деле этот способ подходит только дляdateТип вступает в силу.

spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=GMT+8

И многие проекты используют время и датуAPIдовольно запутанно,java.util.Date,java.util.Calendarиjava.time LocalDateTimeОба существуют, поэтому глобальное форматирование времени должно быть совместимо как со старым, так и с новымAPI.


Прежде чем настраивать формат глобального времени, посмотрите на формат поля времени, возвращаемого интерфейсом.

@Data
public class OrderDTO {

    private LocalDateTime createTime;

    private Date updateTime;
}

Явно не соответствует требованиям отображения на странице (Некоторые люди поднимают планку, почему бы не позволить интерфейсу разобрать время, я могу только сказать, что код в спальном костюме намного проще, чем убеждать людей~)

未做任何配置的结果
Результат без настройки

1. Аннотация @JsonFormat

@JsonFormatМетод аннотации нельзя назвать глобальным форматированием времени в строгом смысле, но его следует называть частичным форматированием, поскольку@JsonFormatАннотацию необходимо использовать в поле времени класса сущностей, и только когда используется соответствующий класс сущностей, соответствующее поле можно форматировать.

@Data
public class OrderDTO {

    @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd")
    private LocalDateTime createTime;

    @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    private Date updateTime;
}

поле плюс@JsonFormatПосле комментирования,LocalDateTimeиDateФормат времени успешен.

@JsonFormat 注解格式化
Форматирование аннотации @JsonFormat

Во-вторых, аннотация @JsonComponent (рекомендовать)

Это метод, который я лично рекомендую, я видел его использование ранее.@JsonFormatЗаметки не могут быть полностью реализованы в глобальном формате времени, поэтому давайте использовать@JsonComponentАннотация из класса для определения глобального формата соответственноDateиLocalDateТипы форматируются.


@JsonComponent
public class DateFormatConfig {

    @Value("${spring.jackson.date-format:yyyy-MM-dd HH:mm:ss}")
    private String pattern;

    /**
     * @author xiaofu
     * @description date 类型全局时间格式化
     * @date 2020/8/31 18:22
     */
    @Bean
    public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilder() {

        return builder -> {
            TimeZone tz = TimeZone.getTimeZone("UTC");
            DateFormat df = new SimpleDateFormat(pattern);
            df.setTimeZone(tz);
            builder.failOnEmptyBeans(false)
                    .failOnUnknownProperties(false)
                    .featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
                    .dateFormat(df);
        };
    }

    /**
     * @author xiaofu
     * @description LocalDate 类型全局时间格式化
     * @date 2020/8/31 18:22
     */
    @Bean
    public LocalDateTimeSerializer localDateTimeDeserializer() {
        return new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(pattern));
    }

    @Bean
    public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
        return builder -> builder.serializerByType(LocalDateTime.class, localDateTimeDeserializer());
    }
}

ВидетьDateиLocalDateДва типа времени успешно отформатированы, и этот метод действителен.

@JsonComponent 注解处理格式化
Формат обработки аннотации @JsonComponent

Но есть проблема, актуальная разработка, если я не хочу иметь настройки формата глобального стиля времени поля,Что делать, если вы хотите настроить формат?

тогда нужно и@JsonFormatАннотации используются вместе с .

@Data
public class OrderDTO {

    @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd")
    private LocalDateTime createTime;

    @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd")
    private Date updateTime;
}

По результатам мы видим@JsonFormatПриоритет аннотации выше, и она будет начинаться с@JsonFormatФормат времени аннотации основан.

3. Аннотация @Configuration

Эта глобальная конфигурация реализована так же, как описано выше.

"

Уведомление: после использования этой конфигурации поле настраивается вручную@JsonFormatАннотации больше не будут действовать.

"

@Configuration
public class DateFormatConfig2 {

    @Value("${spring.jackson.date-format:yyyy-MM-dd HH:mm:ss}")
    private String pattern;

    public static DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    @Bean
    @Primary
    public ObjectMapper serializingObjectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();
        JavaTimeModule javaTimeModule = new JavaTimeModule();
        javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer());
        javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer());
        objectMapper.registerModule(javaTimeModule);
        return objectMapper;
    }

    /**
     * @author xiaofu
     * @description Date 时间类型装换
     * @date 2020/9/1 17:25
     */
    @Component
    public class DateSerializer extends JsonSerializer<Date> {
        @Override
        public void serialize(Date date, JsonGenerator gen, SerializerProvider provider) throws IOException {
            String formattedDate = dateFormat.format(date);
            gen.writeString(formattedDate);
        }
    }

    /**
     * @author xiaofu
     * @description Date 时间类型装换
     * @date 2020/9/1 17:25
     */
    @Component
    public class DateDeserializer extends JsonDeserializer<Date> {

        @Override
        public Date deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
            try {
                return dateFormat.parse(jsonParser.getValueAsString());
            } catch (ParseException e) {
                throw new RuntimeException("Could not parse date", e);
            }
        }
    }

    /**
     * @author xiaofu
     * @description LocalDate 时间类型装换
     * @date 2020/9/1 17:25
     */
    public class LocalDateTimeSerializer extends JsonSerializer<LocalDateTime> {
        @Override
        public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
            gen.writeString(value.format(DateTimeFormatter.ofPattern(pattern)));
        }
    }

    /**
     * @author xiaofu
     * @description LocalDate 时间类型装换
     * @date 2020/9/1 17:25
     */
    public class LocalDateTimeDeserializer extends JsonDeserializer<LocalDateTime> {
        @Override
        public LocalDateTime deserialize(JsonParser p, DeserializationContext deserializationContext) throws IOException {
            return LocalDateTime.parse(p.getValueAsString(), DateTimeFormatter.ofPattern(pattern));
        }
    }
}

Суммировать

Поделитесь простым, но практичнымSpringbootНавыки разработки, по сути, так называемая эффективность разработки, это просто куча навыков разработки, а умные программисты всегда могут выполнять задачи с наименьшим количеством кода.

Если это полезно для вас, добро пожаловать在看,点赞,转发, ваше одобрение - моя самая большая мотивация.

Оригинальность не так проста, сжигание волос на выходе, если есть потеря, пожалуйста, дайте лайк, чтобы поощрить это!

Разобраны и розданы друзьям сотни различных технических электронных книг. Нет общественного внимания [Ответить666] Самовывоз. Мы создали группу технического обмена с друзьями, чтобы обсуждать технологии и делиться технической информацией, стремясь вместе учиться и развиваться. Если вам интересно, присоединяйтесь к нам!