JDK 8日付フォーマット

3183 ワード

なぜフォーマットしますか?
私たち中国人はyyyy-M-dd HH:mm:ssというフォーマットの日付に慣れていますが、どうやって枠を作るかは歪んだ国の大人達が書いたので、彼らの日付フォーマットは私達とはかなり違っています。幸いSpring Bootはspring.jackson.date-formatを提供しましたが、それはjava.util.Dateをフォーマットするしかありません。じゃ解決方法は何ですか?
JDK 8では、新しい重要な特性は、新しい時間と日付のAPIを導入し、それはjava.timeパッケージに収録されています。新しい時間および日付によるAPIは、より簡潔な方法で時間および日付を処理することができる。
JDK 8の前に、時間と日付に関するAPIには以下のいくつかの欠陥があり、これらの欠陥もあり、多くの第三者の日付処理フレーム、例えばJoda-time、date 4 jなどのオープンソースプロジェクトが現れている。しかし、Javaは時間と日付を処理するための標準的なフレームワークを必要とし、JDK 8に新しい日付APIを導入する。JSR-310仕様の実装に従って、Joda-Timeフレームワークの著者はJSR-310の仕様の提唱者ですので、Joda-Timeを使ったことがあるので、新しい日付のAPIにもなじみがありません。
なぜ新しい日付タイプを使うのですか?
1、以前のjava.util.Dateとjava.util.Calendar類の使い勝手が悪く、タイムゾーンをサポートしないで、しかもスレッドセキュリティではない。2、日付フォーマットクラスjava.text.DateFormatは抽象的なクラスであり、使う時は先にSimpleDateFormatオブジェクトを具体化して日付フォーマットを処理する必要があります。また、DateFormatもスレッドセキュリティではありません。これはマルチスレッドプログラムで同じDateFormatオブジェクトを呼び出したら、思いがけない結果が得られます。3、日付の計算方法は煩雑で、しかも間違いやすいです。月は0から始まります。Calendarから取得した月はプラスしてこそ、現在の月を表します。
Springbootではどうやって使いますか?
1、導入依存

    org.springframework.boot
    spring-boot-starter-web

2、プロファイル
第一の方法
設定クラスを定義するだけで、中に二つのビーンを定義すればグローバル日付フォーマット処理が完了します。
package com.jiuyue.config;

import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;


@Configuration
public class LocalDateTimeSerializerConfig {

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

    @Bean
    public LocalDateTimeSerializer localDateTimeDeserializer() {
        return new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(pattern));
    }

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

    @JsonFormat(pattern = "yyyy-MM-dd")
    private LocalDateTime payTime;
    //    GET SET ...
}
第二の方法(強く推奨)
時には、私達は日時のフォーマットに対して特殊な処理をして、全体のフォーマット方式は私達の需要を満たすことができなくて、この方案を使うのはとても良い選択で、@Json Formatを通じて(通って)注解します。
public class Order {

    @JsonFormat(pattern = "yyyy-MM-dd")
    private LocalDateTime payTime;
    //    GET SET ...
}
制御層
package com.jiuyue.controller;

import com.jiuyue.pojo.Order;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.time.LocalDateTime;

@RestController
@RequestMapping("/orders")
public class OrderController {

    @GetMapping
    public Order query() {
        Order order = new Order();
        order.setPayTime(LocalDateTime.now());
        return order;
    }
}