content: package com.aliyun.odps.data;
  
  import java.io.Serializable;
  
  /**
   * Interval Year Month 类型对应的数据类
   *
   * Created by zhenhong.gzh on 16/12/12.
   */
  
  public class IntervalYearMonth implements Comparable<IntervalYearMonth>, Serializable {
    private final static int MONTHS_PER_YEAR = 12;
    private final static int MAX_YEARS = 9999;
  
    protected int totalMonths;
  
    public IntervalYearMonth(int years, int months) {
      if (Math.abs(totalMonths) / MONTHS_PER_YEAR > MAX_YEARS) {
        throw new IllegalArgumentException(Integer.toString(years));
      }
  
      if (Math.abs(months) >= MONTHS_PER_YEAR) {
        throw new IllegalArgumentException(Integer.toString(months));
      }
  
      totalMonths = years * MONTHS_PER_YEAR + months;
    }
  
    public IntervalYearMonth(int totalMonths) {
      if (Math.abs(totalMonths) / MONTHS_PER_YEAR > MAX_YEARS) {
        throw new IllegalArgumentException(Integer.toString(totalMonths));
      }
      this.totalMonths = totalMonths;
    }
  
    public int getTotalMonths() {
      return totalMonths;
    }
  
    public int getYears() {
      return totalMonths / MONTHS_PER_YEAR;
    }
  
    public int getMonths() {
      return totalMonths % MONTHS_PER_YEAR;
    }
  
    @Override
    public String toString() {
      StringBuilder buf = new StringBuilder();
      if (totalMonths < 0) {
        buf.append('-');
      }
      buf.append(Math.abs(getYears())).append('-').append(Math.abs(getMonths()));
      return buf.toString();
    }
  
    @Override
    public int compareTo(IntervalYearMonth o) {
      return totalMonths - o.totalMonths;
    }
  
    @Override
    public boolean equals(Object o) {
      if (this == o)
        return true;
  
      if (o == null || getClass() != o.getClass())
        return false;
  
      IntervalYearMonth that = (IntervalYearMonth) o;
  
      return totalMonths == that.totalMonths;
    }
  
    @Override
    public int hashCode() {
      return totalMonths;
    }
  }
  