package com.gh.mygreen.xlsmapper.annotation; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import java.text.SimpleDateFormat; /** * 日時に対する変換規則を指定するアノテーションです。 * <p>対応するJavaのクラスタイプは次の通りです。</p> * <ul> * <li>{@link java.util.Date}</li> * <li>{@link java.sql.Date}/{@link java.sql.Time}/{@link java.sql.Timestamp}</li> * <li>{@link java.util.Calendar}</li> * </ul> * * * <h3 class="description">書き込み時の注意事項</h3> * * <p>テンプレートファイルのセルの書式を「標準」に設定している場合に書き込むと、 * 書式が「標準」設定の全てのセルの書式が書き換わってしまいます。 * <br>そのため、日付や数値などの書式が必要な場合は、テンプレートファイルで予め書式を設定しておくか、 * アノテーションの属性{@link #excelPattern()}で書式を指定しておいてください。 * </p> * * @version 1.1 * @author T.TSUCHIE * */ @Target({ElementType.METHOD, ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface XlsDateConverter { /** * 日時の書式パターン。{@link java.text.SimpleDateFormat}の書式を指定します。 * <p>読み込み時にセルの種類が日付、時刻ではない場合、 * 文字列として値を取得し、その値を属性{@link #javaPattern()}で指定した書式に従いパースし、Javaの日時型に変換します。 * </p> * * <ul> * <li>属性{@link #javaPattern()}で書式を指定します。 * <br>Javaのクラス{@link SimpleDateFormat}で解釈可能な書式を指定します。 * </li> * <li>属性{@link #locale()}で、ロケールを指定します。 * <br>言語コードのみを指定する場合、'ja'の2桁で指定します。 * <br>言語コードと国コードを指定する場合、'ja _JP'のようにアンダーバーで区切り指定します。 * </li> * <li>属性{@link #lenient()}で、日付/時刻の解析を厳密に行わないか指定します。 * <br>デフォルト値はtrueで、厳密に解析を行いません。falseの場合厳密に解析を行います。 * </li> * <li>書式に合わない値をパースした場合、例外{@link com.gh.mygreen.xlsmapper.cellconvert.TypeBindException}が発生します。</li> * </ul> * * <pre class="highlight"><code class="java"> * public class SampleRecord { * * {@literal @XlsColumn(columnName="有効期限")} * {@literal @XlsDateConverter(javaPattern="yyyy年MM月dd日 HH時mm分ss秒", locale="ja_JP", lenient=true)} * private Date expired; * * } * </code></pre> * * <p>アノテーション{@link XlsDateConverter}を付与しない場合、Javaの型ごとに次の書式が標準で適用されます。</p> * <ul> * <li>{@link java.util.Date}の場合、{@literal "yyyy-MM-dd HH:mm:ss"}</li> * <li>{@link java.sql.Date}の場合、{@literal "yyyy-MM-dd HH:mm:ss"}</li> * <li>{@link java.sql.Time}の場合、{@literal "HH:mm:ss"}</li> * <li>{@link java.sql.Timestamp}の場合、{@literal "yyyy-MM-dd HH:mm:ss.SSS"}</li> * <li>{@link java.util.Calendar}の場合、{@literal "yyyy-MM-dd HH:mm:ss"}</li> * </ul> * * @since 1.1 * @return */ String javaPattern() default ""; /** * 日付/時刻の解析を厳密に行うか指定します。 * <p>属性{@link #javaPattern()}を設定した場合に有効になります。</p> * @return */ boolean lenient() default false; /** * ロケールの指定を行います。指定しない場合、デフォルトのロケールで処理されます。 * <p>国コード、バリアントを指定したい場合は、アンダーバー '_' で区切ります。</p> * <p>例. 'ja', 'ja_JP', 'ja_JP_JP'</p> * <p>属性{@link #javaPattern()}を設定した場合に有効になります。</p> * @return */ String locale() default ""; /** * 書き込み時にセルの書式を直接設定したい場合に指定します。 * <p>値を指定しない場合、テンプレートファイルに設定してある書式が適用されます。</p> * * <ul> * <li>属性{@link #excelPattern()}で書式を指定します。 * <br>Excelの書式を指定する場合は、 * <a href="http://mygreen.github.io/excel-cellformatter/sphinx/format_basic.html" target="_blank">ユーザ定義</a> * の形式で指定します。 * </li> * </ul> * * <pre class="highlight"><code class="java"> * public class SampleRecord { * * {@literal @XlsColumn(columnName="有効期限")} * {@literal @XlsDateConverter(excelPattern="[$-411]yyyy\"年\"mm\"月\"dd\"日\" hh\"時\"mm\"分\"ss\"秒\"")} * private Date expired; * * } * </code></pre> * * @since 1.1 */ String excelPattern() default ""; }