@CsvDateTimeFormat

日時型に対する書式を指定する際に利用するアノテーションです。

アノテーションを付与しないときや属性 pattern を指定しないときは、クラスタイプごとに決まった標準の書式が適用されます。 対応するJavaのクラスタイプと標準の書式は以下の通りです。

対応する日時のクラスタイプと標準の書式

クラスタイプ

標準の書式

java.util.Date

yyyy-MM-dd HH:mm:ss

java.util.Calendar

yyyy-MM-dd HH:mm:ss

java.sql.Date

yyyy-MM-dd

java.sql.Time

HH:mm:ss

java.sql.Timestamp

yyyy-MM-dd HH:mm:ss.SSS

java.time.LocalDateTime

uuuu-MM-dd HH:mm:ss

java.time.LocalDate

uuuu-MM-dd

java.time.ZonedDateTime

uuuu-MM-dd HH:mm:ssxxx'['VV']'

org.joda.time.LocalDateTime

yyyy-MM-dd HH:mm:ss

org.joda.time.LocalDate

yyyy-MM-dd

org.joda.time.LocalTime

HH:mm:ss

org.joda.time.DateTime

yyyy-MM-dd HH:mm:ssZZ

読み込み/書き込み時の書式を指定したい場合

  • 属性 pattern で書式を指定します。

    • 省略した場合、クラスタイプごとの標準の書式が適用されます。

    • java.util.Date/java.util.Calendar/java.sql.XXXX系のクラスの場合、 java.text.SimpleDateFormat で解釈可能な書式を設定します。

    • java.time.XXX系のクラスの場合、 java.time.format.DateTimeFormatter で解釈可能な書式を設定します。

    • org.joda.time.XXX系のクラスの場合は、 org.joda.time.format.DateTimeFormat で解釈可能な書式を設定します。

  • 属性 locale でロケールを指定します。

    • 言語コードのみを指定する場合、 ja の2桁で指定します。

    • 言語コードと国コードを指定する場合、 ja_JP のようにアンダーバーで区切り指定します。

    • 和暦を扱う時など、バリアントを指定する場合も同様に、 ja_JP_JP のようにさらにアンダーバーで区切り指定します。

  • 属性 timezone でタイムゾーンを指定します。

    • Asia/Tokyo, GMT, GMT+09:00などの値を指定します。

    • ただし、オフセットを持たないクラスタイプ「LocalDateTime, LocalDate, LocalTime」の時は、指定しても意味がありません。

  • 書式に合わない値をパースした場合、例外 SuperCsvValidationException が発生します。

 1import com.github.mygreen.supercsv.annotation.CsvBean;
 2import com.github.mygreen.supercsv.annotation.CsvColumn;
 3import com.github.mygreen.supercsv.annotation.format.CsvDateTimeFormat;
 4
 5import java.util.Date;
 6import java.time.LocalDateTime;
 7
 8@CsvBean
 9public class SampleCsv {
10
11    // 和暦を扱う場合
12    @CsvColumn(number=1)
13    @CsvDateTimeFormat(pattern="GGGGyy年MM月dd日", locale="ja_JP_JP")
14    private Date japaneseDate;
15
16    @CsvColumn(number=2, label="更新日時")
17    @CsvDateTimeFormat(pattern="uuuu/MM/dd HH:mm:ss")
18    private LocalDateTime updateTime;
19
20    // setter/getterは省略
21}

読み込み時に曖昧に解析したい場合

曖昧なケースでも読み込めるようにしたいときは、属性 lenient の値をtrueにします。

例えば、 2016-02-31 と存在しない日を解析する場合、 2016-03-02 と補正が行われます。

 1import com.github.mygreen.supercsv.annotation.CsvBean;
 2import com.github.mygreen.supercsv.annotation.CsvColumn;
 3import com.github.mygreen.supercsv.annotation.format.CsvDateTimeFormat;
 4
 5import java.time.LocalDate;
 6
 7@CsvBean
 8public class SampleCsv {
 9
10    @CsvColumn(number=1, label="誕生日")
11    @CsvDateTimeFormat(lenient=true)
12    private LocalDate birthday;
13
14    // setter/getterは省略
15}

読み込み時の値のパースに失敗した際のメッセージ

読み込み時に値のパースに失敗した時に独自のメッセージとして、属性 message で指定することができます。

メッセージ中は、JEXL による式言語を使うことができ、 予め登録されている変数を用いて、メッセージ内容を独自にカスタマイズすることができます。 詳細は、値の検証時のメッセージ を参照してください。

メッセージ中で利用可能な変数は、JavaDoc を参照してください。

 1import com.github.mygreen.supercsv.annotation.CsvBean;
 2import com.github.mygreen.supercsv.annotation.CsvColumn;
 3import com.github.mygreen.supercsv.annotation.format.CsvDateTimeFormat;
 4
 5import java.time.LocalDate;
 6
 7@CsvBean
 8public class SampleCsv {
 9
10    @CsvColumn(number=1, label="誕生日")
11    @CsvDateTimeFormat(pattern="uuuu/M/d", message="[{rowNumber}行, {columnNumber}列] : 項目「{label}」の値({validatedValue})は、日付の書式「{pattern}」として不正です。"
12    private LocalDate birthday;
13
14    // setter/getterは省略
15}