"Эта статья размещена в личном блоге: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
Формат времени успешен.
Во-вторых, аннотация @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
Два типа времени успешно отформатированы, и этот метод действителен.
Но есть проблема, актуальная разработка, если я не хочу иметь настройки формата глобального стиля времени поля,Что делать, если вы хотите настроить формат?
тогда нужно и@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] Самовывоз. Мы создали группу технического обмена с друзьями, чтобы обсуждать технологии и делиться технической информацией, стремясь вместе учиться и развиваться. Если вам интересно, присоединяйтесь к нам!