LoginSignup
17
10

More than 5 years have passed since last update.

JavaでDateをISO 8601 拡張形式で出力する

Last updated at Posted at 2018-12-19

はじめに

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;
    }
}

終わりに

言語毎に微妙にフォーマットが違うので意外とハマる印象。
全部統一されないものか・・・・・

17
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
10