Spring Boot Jackson Формат даты и времени - PullRequest
1 голос
/ 20 марта 2019

application.yml конфигурация:

jackson:
    date-format: yyyy-MM-dd
    timestamp-format:yyyy-MM-dd HH:mm:ss
    serialization:
      write-dates-as-timestamps: false

Свойства бобов:

@Entity 
@Column(nullable = false)
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Temporal(TemporalType.DATE)
private Date date_created;

@Column(nullable = false)
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Temporal(TemporalType.TIMESTAMP)
private Date reg_date;

Я установил все поля Date как тип java.util.Date, которые получают дату в формате yyyy-MM-dd и тип отметки времени (yyyy-MM-dd HH:mm:ss) в соответствии со стилем параметров запроса (yyyy-MM-dd или yyyy-MM-dd HH:mm:ss)

Для использования timestamp я нашел @Temporal (TemporalType.Date или Timestamp), который отображается на DB Type.

Формат даты и времени хранится правильно, например yyyy-MM-dd или yyyy-MM-dd HH:mm:ss.sss

RestController класс:

@PostMapping("/")
public ResponseEntity<Object> create(@RequestBody CreateVO createVO, HttpServletRequest request) {
    System.out.println("planned_date> "+createVO.getDate_planned_start());
    System.out.println("regdate> "+createVO.getReg_date());    
}

Установлены на:

planned_date> Wed Mar 20 09:00:00 KST 2019 // Date Result
regdate> Mon Oct 01 16:45:00 KST 2012 //Timestamp Result

Однако я получаю в RestController Date в другом формате, чем я ожидал.

Есть ли какое-нибудь решение для получения yyyy-MM-dd и yyyy-MM-dd HH:mm:ss в Controller?

Меня интересуют и настройки application.yml. Потому что я не уверен, как установить формат отметки времени.

1 Ответ

2 голосов
/ 21 марта 2019

Прежде всего, метод Date.toString генерирует вводящий в заблуждение вывод, и мы не должны на него полагаться. Простой пример:

SimpleDateFormat dateToStringFormat = new SimpleDateFormat("EEE MMM dd HH:mm:ss Z yyyy", new Locale("us"));
Date parsed = dateToStringFormat.parse("Wed Mar 20 09:00:00 KST 2019");
System.out.println("Default toString: " + parsed);

dateToStringFormat.setTimeZone(TimeZone.getTimeZone("Asia/Seoul"));
System.out.println("With 'Asia/Seoul' TZ: " + dateToStringFormat.format(parsed));

dateToStringFormat.setTimeZone(TimeZone.getTimeZone("Chile/Continental"));
System.out.println("With 'Chile/Continental' TZ: " + dateToStringFormat.format(parsed));

печать:

Default toString: Wed Mar 20 01:00:00 CET 2019
With 'Asia/Seoul' TZ: Wed Mar 20 09:00:00 +0900 2019
With 'Chile/Continental' TZ: Tue Mar 19 21:00:00 -0300 2019

Как вы можете видеть, я проанализировал вашу примерную дату Wed Mar 20 09:00:00 KST 2019 и напечатал с использованием метода toString и отформатировал ее с двумя разными часовыми поясами. Итак, каждый видит дату в сочетании со своим часовым поясом. Подробнее о:

Мы не можем определить шаблоны даты в конфигурации, как вы предложили. Смотрите доступные Jackson опции конфигурации здесь .

Вы можете настроить формат, используя аннотацию com.fasterxml.jackson.annotation.JsonFormat. Поскольку Java 8 доступно, мы должны использовать java.time.* классы для связанных со временем свойств. Пример POJO класс может выглядеть так:

import com.fasterxml.jackson.annotation.JsonFormat;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.MonthDay;

public class RequestPayload {

    @JsonFormat(pattern = "MM/dd")
    private MonthDay md;

    @JsonFormat(pattern = "yyyy-MM-dd")
    private LocalDate date;

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime dateTime;

    // getters, setters, toString
}

Чтобы все заработало, нужно зарегистрировать JavaTimeModule модуль:

@Bean
public Jackson2ObjectMapperBuilder objectMapperBuilder() {
    Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
    builder.modules(new JavaTimeModule());

    return builder;
}

Если вы можете изменить свои свойства Bean на java.time.* классы, просто увеличьте эти даты с Controller до DB. В другом случае см. Этот вопрос: Преобразование между java.time.LocalDateTime и java.util.Date .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...