はじめに
Spring BootでRESTful APIを作っている時に、レスポンスのDate型をISO 8601 拡張形式にフォーマットして返したかった。
フォーマットを探すのに時間がかかったので備忘録として残す。
フォーマット
yyyy-MM-dd'T'HH:mm:ssXXX
で出力できる。
Test.java
import java.text.SimpleDateFormat;
import java.util.Date;
public class Test {
public static void main(String[] args) {
Date d = new Date();
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX");
System.out.println(sf.format(d));
}
}
2018-12-19T15:46:06+09:00
Spring Bootのレスポンスとして使用する
Spring Bootを使っていれば、レスポンスのJSON変換としてJacksonを使用しているはず。
application.yml
に以下の設定を追加することでデフォルトのフォーマットを指定できる。
application.yml
spring:
jackson:
date-format: "yyyy-MM-dd'T'HH:mm:ssXXX"
time-zone: "Asia/Tokyo"
Jacksonはタイムゾーンを指定しないとGMTになる。
基本的にタイムゾーン指定しておくのが良いと思う。
デフォルトのフォーマットではなく、明示的にフォーマットを変換したい場合は以下のように書く。
Response.java
import com.fasterxml.jackson.annotation.JsonFormat;
import java.util.Date;
public class Response {
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ssXXX", timezone = "Asia/Tokyo")
private Date createdAt;
public Date getCreatedAt() {
return createdAt;
}
public void setCreatedAt(Date createdAt) {
this.createdAt = createdAt;
}
}
終わりに
言語毎に微妙にフォーマットが違うので意外とハマる印象。
全部統一されないものか・・・・・