blob: 7202defb04c3d5ddf12afd7416790e9cd2b6306c [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.tajo.util.datetime;
import org.apache.tajo.util.datetime.DateTimeConstants.DateStyle;
import java.util.TimeZone;
public class TimeMeta implements Comparable<TimeMeta> {
public int fsecs; // 1/1,000,000 secs
public int secs;
public int minutes;
public int hours;
public int dayOfMonth;
public int dayOfYear; //used for only DateTimeFormat
public int monthOfYear; // origin 0, not 1
public int years; // relative to 1900
public boolean isDST; // daylight savings time
public int dayOfWeek;
public int timeZone = Integer.MAX_VALUE; //sec, used for only Text -> Timestamp
@Override
public String toString() {
return DateTimeUtil.encodeDateTime(this, DateStyle.ISO_DATES);
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + dayOfMonth;
result = prime * result + dayOfWeek;
result = prime * result + dayOfYear;
result = prime * result + fsecs;
result = prime * result + hours;
result = prime * result + (isDST ? 1231 : 1237);
result = prime * result + minutes;
result = prime * result + monthOfYear;
result = prime * result + secs;
result = prime * result + timeZone;
result = prime * result + years;
return result;
}
@Override
public boolean equals(Object o) {
if (!(o instanceof TimeMeta)) {
return false;
}
TimeMeta other = (TimeMeta)o;
return fsecs == other.fsecs &&
secs == other.secs &&
minutes == other.minutes &&
hours == other.hours &&
dayOfMonth == other.dayOfMonth &&
dayOfYear == other.dayOfYear &&
monthOfYear == other.monthOfYear &&
years == other.years &&
isDST == other.isDST
;
}
public void plusMonths(int months) {
if (months == 0) {
return;
}
int thisYear = years;
int thisMonth = monthOfYear;
int yearToUse;
// Initially, monthToUse is zero-based
int monthToUse = thisMonth - 1 + months;
if (monthToUse >= 0) {
yearToUse = thisYear + (monthToUse / DateTimeConstants.MONTHS_PER_YEAR);
monthToUse = (monthToUse % DateTimeConstants.MONTHS_PER_YEAR) + 1;
} else {
yearToUse = thisYear + (monthToUse / DateTimeConstants.MONTHS_PER_YEAR) - 1;
monthToUse = Math.abs(monthToUse);
int remMonthToUse = monthToUse % DateTimeConstants.MONTHS_PER_YEAR;
// Take care of the boundary condition
if (remMonthToUse == 0) {
remMonthToUse = DateTimeConstants.MONTHS_PER_YEAR;
}
monthToUse = DateTimeConstants.MONTHS_PER_YEAR - remMonthToUse + 1;
// Take care MONTHS_PER_YEAR the boundary condition
if (monthToUse == 1) {
yearToUse += 1;
}
}
// End of do not refactor.
// ----------------------------------------------------------
//
// Quietly force DOM to nearest sane value.
//
int dayToUse = dayOfMonth;
int maxDay = DateTimeUtil.getDaysInYearMonth(yearToUse, monthToUse);
if (dayToUse > maxDay) {
dayToUse = maxDay;
}
this.years = yearToUse;
this.monthOfYear = monthToUse;
this.dayOfMonth = dayToUse;
}
public void plusDays(int days) {
long timestamp = DateTimeUtil.toJulianTimestamp(this);
timestamp += days * DateTimeConstants.USECS_PER_DAY;
DateTimeUtil.toJulianTimeMeta(timestamp, this);
}
public void plusMillis(long millis) {
plusTime(millis * 1000);
}
public void convertToUTC(TimeZone zone) {
long timestamp = DateTimeUtil.toJulianTimestamp(this);
timestamp -= (getZonedOffset(timestamp, zone) * 1000L);
DateTimeUtil.toJulianTimeMeta(timestamp, this);
}
public void convertToLocalTime(TimeZone zone) {
long timestamp = DateTimeUtil.toJulianTimestamp(this);
timestamp += (getZonedOffset(timestamp, zone) * 1000L);
DateTimeUtil.toJulianTimeMeta(timestamp, this);
}
public int getZonedOffset(long julianTimestamp, TimeZone zone) {
return zone.getOffset(DateTimeUtil.julianTimeToJavaTime(julianTimestamp));
}
public void plusTime(long time) {
long timestamp = DateTimeUtil.toJulianTimestamp(this);
timestamp += time;
DateTimeUtil.toJulianTimeMeta(timestamp, this);
}
public void plusInterval(int months, long milliseconds) {
if (months != 0) {
plusMonths(months);
}
if (milliseconds != 0) {
plusMillis(milliseconds);
}
}
public int getCenturyOfEra() {
return DateTimeUtil.getCenturyOfEra(years);
}
public int getDayOfYear() {
int dayOfYear = 0;
for (int i = 0; i < monthOfYear - 1; i++) {
dayOfYear += DateTimeUtil.getDaysInYearMonth(years, i + 1);
}
return dayOfYear + dayOfMonth;
}
public int getWeekOfYear() {
return DateTimeUtil.date2isoweek(years, monthOfYear, dayOfMonth);
}
public int getWeekyear() {
return DateTimeUtil.date2isoyear(years, monthOfYear, dayOfMonth);
}
public int getISODayOfWeek() {
int dow = getDayOfWeek();
if (dow == 0) { //Sunday
return 7;
} else {
return dow;
}
}
public int getDayOfWeek() {
return (DateTimeUtil.date2j(years, monthOfYear, dayOfMonth) + 1) % 7;
}
@Override
public int compareTo(TimeMeta o) {
int result = 1;
if (o != null) {
long leftjulianTimestamp = DateTimeUtil.toJulianTimestamp(this);
long rightjulianTimestamp = DateTimeUtil.toJulianTimestamp(o);
result = (int) Math.signum(leftjulianTimestamp - rightjulianTimestamp);
}
return result;
}
}