All Downloads are FREE. Search and download functionalities are using the official Maven repository.

leap.lang.value.DateTimeOffset Maven / Gradle / Ivy

The newest version!
/*
 * Copyright 2012 the original author or authors.
 *
 * Licensed 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 leap.lang.value;

import java.io.InvalidObjectException;
import java.io.ObjectInputStream;
import java.io.Serializable;
import java.math.BigDecimal;
import java.sql.Timestamp;
import java.util.Calendar;
import java.util.Locale;
import java.util.TimeZone;

public final class DateTimeOffset implements Serializable, Comparable {
	private static final long serialVersionUID = 541973748553014280L;
	private final long utcMillis;
	private final int nanos;
	private final int minutesOffset;
	private static final int NANOS_MIN = 0;
	private static final int NANOS_MAX = 999999999;
	private static final int MINUTES_OFFSET_MIN = -840;
	private static final int MINUTES_OFFSET_MAX = 840;
	private static final int HUNDRED_NANOS_PER_SECOND = 10000000;
	private String formattedValue = null;

	private DateTimeOffset(Timestamp paramTimestamp, int paramInt) {
		if ((paramInt < MINUTES_OFFSET_MIN) || (paramInt > MINUTES_OFFSET_MAX))
			throw new IllegalArgumentException();
		this.minutesOffset = paramInt;

		int i = paramTimestamp.getNanos();
		if ((i < NANOS_MIN) || (i > NANOS_MAX)) {
			throw new IllegalArgumentException();
		}

		int j = (i + 50) / 100;
		this.nanos = (100 * (j % HUNDRED_NANOS_PER_SECOND));
		this.utcMillis = (paramTimestamp.getTime() - paramTimestamp.getNanos() / 1000000 + 1000 * (j / 10000000));

		assert ((this.minutesOffset >= MINUTES_OFFSET_MIN) && (this.minutesOffset <= MINUTES_OFFSET_MAX)) : ("minutesOffset: " + this.minutesOffset);
		assert ((this.nanos >= 0) && (this.nanos <= NANOS_MAX)) : ("nanos: " + this.nanos);
		assert (0 == this.nanos % 100) : ("nanos: " + this.nanos);
		assert (0L == this.utcMillis % 1000L) : ("utcMillis: " + this.utcMillis);
	}

	public static DateTimeOffset valueOf(Timestamp paramTimestamp, int paramInt) {
		return new DateTimeOffset(paramTimestamp, paramInt);
	}

	public static DateTimeOffset valueOf(Timestamp paramTimestamp, Calendar paramCalendar) {
		paramCalendar.setTimeInMillis(paramTimestamp.getTime());

		return new DateTimeOffset(paramTimestamp, (paramCalendar.get(15) + paramCalendar.get(16)) / 60000);
	}

	public String toString() {
		String str1 = this.formattedValue;
		if (null == str1) {
			String str2 = this.minutesOffset < 0 ? String.format(Locale.US, "-%1$02d:%2$02d", new Object[] {
			        Integer.valueOf(-this.minutesOffset / 60), Integer.valueOf(-this.minutesOffset % 60) }) : String.format(Locale.US,
			        "+%1$02d:%2$02d", new Object[] { Integer.valueOf(this.minutesOffset / 60), Integer.valueOf(this.minutesOffset % 60) });

			Calendar localCalendar = Calendar.getInstance(TimeZone.getTimeZone("GMT" + str2), Locale.US);

			localCalendar.setTimeInMillis(this.utcMillis);

			assert ((this.nanos >= 0) && (this.nanos <= NANOS_MAX));

			this.formattedValue = (str1 = 0 == this.nanos ? String.format(Locale.US, "%1$tF %1$tT %2$s", new Object[] { localCalendar, str2 })
			        : String.format(Locale.US, "%1$tF %1$tT.%2$s %3$s", new Object[] { localCalendar,
			                BigDecimal.valueOf(this.nanos, 9).stripTrailingZeros().toPlainString().substring(2), str2 }));
		}

		return str1;
	}

	public boolean equals(Object paramObject) {
		if (this == paramObject) {
			return true;
		}

		if (!(paramObject instanceof DateTimeOffset)) {
			return false;
		}

		DateTimeOffset localEdmDateTimeOffset = (DateTimeOffset) paramObject;
		return (this.utcMillis == localEdmDateTimeOffset.utcMillis) && (this.nanos == localEdmDateTimeOffset.nanos)
		        && (this.minutesOffset == localEdmDateTimeOffset.minutesOffset);
	}

	public int hashCode() {
		assert (0L == this.utcMillis % 1000L);
		long l = this.utcMillis / 1000L;

		int i = 571;
		i = 2011 * i + (int) l;
		i = 3217 * i + (int) (l / 60L * 60L * 24L * 365L);

		i = 3919 * i + this.nanos / 100000;
		i = 4463 * i + this.nanos / 1000;
		i = 5227 * i + this.nanos;

		i = 6689 * i + this.minutesOffset;
		i = 7577 * i + this.minutesOffset / 60;

		return i;
	}

	public Timestamp getTimestamp() {
		Timestamp localTimestamp = new Timestamp(this.utcMillis);
		localTimestamp.setNanos(this.nanos);
		return localTimestamp;
	}

	public int getMinutesOffset() {
		return this.minutesOffset;
	}

	public int compareTo(DateTimeOffset paramEdmDateTimeOffset) {
		assert (this.nanos >= 0);
		assert (paramEdmDateTimeOffset.nanos >= 0);

		return this.utcMillis < paramEdmDateTimeOffset.utcMillis ? -1 : this.utcMillis > paramEdmDateTimeOffset.utcMillis ? 1 : this.nanos
		        - paramEdmDateTimeOffset.nanos;
	}

	private Object writeReplace() {
		return new SerializationProxy(this);
	}

	private void readObject(ObjectInputStream paramObjectInputStream) throws InvalidObjectException {
		throw new InvalidObjectException("");
	}

	private static class SerializationProxy implements Serializable {
		private final long utcMillis;
		private final int nanos;
		private final int minutesOffset;
		private static final long serialVersionUID = 664661379547314226L;

		SerializationProxy(DateTimeOffset paramEdmDateTimeOffset) {
			this.utcMillis = paramEdmDateTimeOffset.utcMillis;
			this.nanos = paramEdmDateTimeOffset.nanos;
			this.minutesOffset = paramEdmDateTimeOffset.minutesOffset;
		}

		private Object readResolve() {
			Timestamp localTimestamp = new Timestamp(this.utcMillis);
			localTimestamp.setNanos(this.nanos);
			return new DateTimeOffset(localTimestamp, this.minutesOffset);
		}
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy