EraPeriod.java

package com.github.mygreen.cellformatter.lang;

import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;


/**
 * 平成などの時代の期間を表すクラス。
 * 
 * @version 0.5
 * @author T.TSUCHIE
 */
public class EraPeriod {
    
    /**
     * 不明な時代の期間を示すクラス。
     * <p>存在しない期間を示すにも使用する。
     * @since 0.5
     */
    public static final EraPeriod UNKNOWN_PERIOD = new EraPeriod() {
        
        @Override
        public boolean isUnknown() {
            return true;
        }
        
    };
            
    
    /** 省略時のローマ字名 (例:H)*/
    private String abbrevRomanName;
    
    /** 省略時の名称(例:平) */
    private String abbrevName;
    
    /** 正式名称(例:平成) */
    private String name;
    
    /** 開始日時(期限がない場合は、nullを設定する) */
    private Date startDate;
    
    /** 終了日時(期限がない場合は、nullを設定する) */
    private Date endDate;
    
    /**
     * 指定した日時が含まれているかどうか。
     * @param date チェック対象の日時。タイムゾーンは、{@literal GMT-00:00}である必要がある。
     * @return true:この時代に含まれている。
     * @throws IllegalArgumentException {@literal date == null.}
     */
    public boolean contains(final Date date) {
        
        ArgUtils.notNull(date, "date");
        
        if(startDate == null) {
            return endDate.compareTo(date) >= 0;
            
        } else if(endDate == null) {
            return startDate.compareTo(date) <= 0;
            
        } else {
            return (endDate.compareTo(date) >= 0) && (startDate.compareTo(date) <= 0);
        }
        
    }
    
    /**
     * 指定した日時が、開始日時から経過した年を取得する。
     * @param cal チェック対象の日時。タイムゾーンは、{@literal GMT-00:00}である必要がある。
     * @return
     * @throws IllegalArgumentException {@literal cal == null.}
     */
    public int getEraYear(final Calendar cal) {
        ArgUtils.notNull(cal, "cal");
        
        final Calendar startCal = Calendar.getInstance(TimeZone.getTimeZone("GMT-00:00"));
        startCal.setTime(startDate);
        
        final int diff = cal.get(Calendar.YEAR) - startCal.get(Calendar.YEAR) + 1;
        return diff;
        
    }
    
    @Override
    public String toString() {
        
        StringBuilder sb = new StringBuilder();
        sb.append(EraPeriod.class.getSimpleName()).append("[").append(getName()).append("]");
        if(startDate != null) {
            sb.append("[start=").append(ExcelDateUtils.formatDate(startDate)).append("]");
        }
        
        if(endDate != null) {
            sb.append("[end=").append(ExcelDateUtils.formatDate(endDate)).append("]");
        }
        
        return sb.toString();
        
    }
    
    /**
     * 元号のローマ字の省略名を取得する。
     * @return
     */
    public String getAbbrevRomanName() {
        return abbrevRomanName;
    }
    
    /**
     * 元号のローマ字の省略名を設定する。
     * @param abbrevRomanName
     */
    void setAbbrevRomanName(String abbrevRomanName) {
        this.abbrevRomanName = abbrevRomanName;
    }
    
    /**
     * 元号のロケールに対する省略名を取得する。
     * 
     * @return 日本語の場合、「平成」だと「平」の値。
     */
    public String getAbbrevName() {
        return abbrevName;
    }
    
    /**
     * 元号のロケールに対する省略名を設定する。
     * @param abbrevName ロケールに対する省略名
     */
    void setAbbrevName(String abbrevName) {
        this.abbrevName = abbrevName;
    }
    
    /**
     * 元号の名称を取得する
     * @return
     */
    public String getName() {
        return name;
    }
    
    /**
     * 元号の名称を設定する
     * @return
     */
    void setName(String name) {
        this.name = name;
    }
    
    /**
     * 開始日を取得する
     * @return
     */
    public Date getStartDate() {
        return startDate;
    }
    
    /**
     * 開始日を設定する
     * @param startDate
     */
    void setStartDate(Date startDate) {
        this.startDate = startDate;
    }
    
    /**
     * 終了日を設定する
     * @param endDate
     */
    void setEndDate(Date endDate) {
        this.endDate = endDate;
    }
    
    /**
     * 終了日を取得する
     * @return 終了日がない現行の元号の場合は{@literal null}を返す。
     */
    public Date getEndDate() {
        return endDate;
    }
    
    /**
     * 不明な期間かどうか。
     * @since 0.5
     * @return {@link #UNKNOWN_PERIOD}のインスタンスのとき、trueを返す。
     */
    public boolean isUnknown() {
        return false;
    }
    
}