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、導入依存
第一の方法
設定クラスを定義するだけで、中に二つのビーンを定義すればグローバル日付フォーマット処理が完了します。
時には、私達は日時のフォーマットに対して特殊な処理をして、全体のフォーマット方式は私達の需要を満たすことができなくて、この方案を使うのはとても良い選択で、@Json Formatを通じて(通って)注解します。
私たち中国人は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;
}
}