package com.aliyun.odps.data; import java.util.concurrent.TimeUnit; /** * Interval Day Time 类型对应的数据类 * * Created by zhenhong.gzh on 16/12/12. */ public class IntervalDayTime implements Comparable<IntervalDayTime> { private final static int NANOS_PER_SECOND = 1000000000; protected long totalSeconds; protected int nanos; public IntervalDayTime(long totalSeconds, int nanos) { if (nanos != 0) { long secondsFromNano = nanos / NANOS_PER_SECOND; nanos %= NANOS_PER_SECOND; totalSeconds += secondsFromNano; } this.totalSeconds = totalSeconds; this.nanos = nanos; if (totalSeconds > 0 && nanos < 0) { --totalSeconds; nanos += NANOS_PER_SECOND; } else if (totalSeconds < 0 && nanos > 0) { ++totalSeconds; nanos -= NANOS_PER_SECOND; } } public long getTotalSeconds() { return totalSeconds; } public int getNanos() { return nanos; } public int getDays() { return (int)TimeUnit.SECONDS.toDays(totalSeconds); } public int getHours() { return (int)(TimeUnit.SECONDS.toHours(totalSeconds) % TimeUnit.DAYS.toHours(1)); } public int getMinutes() { return (int)(TimeUnit.SECONDS.toMinutes(totalSeconds) % TimeUnit.HOURS.toMinutes(1)); } public int getSeconds() { return (int)(totalSeconds % TimeUnit.MINUTES.toSeconds(1)); } @Override public int compareTo(IntervalDayTime o) { long diffSeconds = totalSeconds - o.totalSeconds; return diffSeconds < 0 ? -1 : diffSeconds == 0 ? nanos - o.nanos : 1; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; IntervalDayTime that = (IntervalDayTime) o; if (totalSeconds != that.totalSeconds) return false; return nanos == that.nanos; } @Override public int hashCode() { int result = (int) (totalSeconds ^ (totalSeconds >>> 32)); result = 31 * result + nanos; return result; } @Override public String toString() { StringBuilder buf = new StringBuilder(); if (totalSeconds < 0 || nanos < 0) { buf.append('-'); } int days = getDays(); if (days < 0) { days = -days; } int hours = getHours(); if (hours < 0) { hours = -hours; } int minutes = getMinutes(); if (minutes < 0) { minutes = - minutes; } int seconds = getSeconds(); if (seconds < 0) { seconds = -seconds; } int nanos = getNanos(); if (nanos < 0) { nanos = -nanos; } buf.append(days); buf.append(String.format(" %02d:%02d:%02d.%09d", hours, minutes, seconds, nanos)); return buf.toString(); } }