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

com.metsci.glimpse.util.units.time.TimeStampPosixMillisInt64 Maven / Gradle / Ivy

The newest version!
/*
 * Copyright (c) 2020, Metron, Inc.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *     * Redistributions of source code must retain the above copyright
 *       notice, this list of conditions and the following disclaimer.
 *     * Redistributions in binary form must reproduce the above copyright
 *       notice, this list of conditions and the following disclaimer in the
 *       documentation and/or other materials provided with the distribution.
 *     * Neither the name of Metron, Inc. nor the
 *       names of its contributors may be used to endorse or promote products
 *       derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL METRON, INC. BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
package com.metsci.glimpse.util.units.time;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Calendar;
import java.util.Date;

import com.metsci.glimpse.util.GeneralUtils;
import com.metsci.glimpse.util.units.time.format.TimeStampFormat;
import com.metsci.glimpse.util.units.time.format.TimeStampParseException;

/**
 * A TimeStamp implementation that stores the number of milliseconds since the
 * epoch (1970-01-01 00:00:00 UTC) as a long.
 * 

* Advantages of this implementation: *

    *
  • In many cases, it is desirable to store time as POSIX milliseconds because * existing systems or libraries do (java.lang.Date and MySQL, for example). * By storing POSIX milliseconds, we avoid conversion costs. *
  • Storing an integral representation of a time allows reversible arithmetic * and sensible comparison. *
*

* Disadvantanges of this implementation: *

    *
  • Storing microseconds would give better precision without requiring more * storage or introducing more complexity. The max range of POSIX microseconds * (300,000 years) is sufficient for any imaginable application. *
  • This class's methods are subject to arithmetic overflow. However, this does * happen until the distance from the epoch reaches about 300 million years, so we * make no effort to detect overflow. *
* * @author hogye */ public class TimeStampPosixMillisInt64 extends TimeStamp implements Serializable { private static final long serialVersionUID = 2651020962415316423L; protected static final double millisToSeconds = 1e-3; protected static final int millisDecimalScale = 3; protected static final long millisToMicros = 1000L; protected static final long millisToNanos = 1000000L; protected static final double microsToMillis = 1e-3; protected static final double nanosToMillis = 1e-6; // IODH idiom avoids cycles in class initialization private static class Instances { public static final TimeStampPosixMillisInt64 posixEpoch = new TimeStampPosixMillisInt64( 0 ); } public static final TimeStampFactory factory = new TimeStampFactory( ) { public TimeStampPosixMillisInt64 fromPosixSeconds( double posixSeconds ) { long posixMillis = Math.round( Time.secondsToMilliseconds( posixSeconds ) ); return new TimeStampPosixMillisInt64( posixMillis ); } public TimeStampPosixMillisInt64 fromPosixSeconds( BigDecimal posixSeconds ) { long posixMillis = posixSeconds.scaleByPowerOfTen( millisDecimalScale ).longValue( ); return new TimeStampPosixMillisInt64( posixMillis ); } public TimeStampPosixMillisInt64 fromPosixMillis( long posixMillis ) { return new TimeStampPosixMillisInt64( posixMillis ); } public TimeStampPosixMillisInt64 fromPosixMicros( long posixMicros ) { long posixMillis = Math.round( posixMicros * microsToMillis ); return new TimeStampPosixMillisInt64( posixMillis ); } public TimeStampPosixMillisInt64 fromPosixNanos( long posixNanos ) { long posixMillis = Math.round( posixNanos * nanosToMillis ); return new TimeStampPosixMillisInt64( posixMillis ); } public TimeStampPosixMillisInt64 fromTimeStamp( TimeStamp timeStamp ) { long posixMillis = timeStamp.toPosixMillis( ); return new TimeStampPosixMillisInt64( posixMillis ); } public TimeStampPosixMillisInt64 fromDate( Date date ) { long posixMillis = date.getTime( ); return new TimeStampPosixMillisInt64( posixMillis ); } public TimeStampPosixMillisInt64 fromCalendar( Calendar calendar ) { long posixMillis = calendar.getTimeInMillis( ); return new TimeStampPosixMillisInt64( posixMillis ); } public TimeStampPosixMillisInt64 fromString( String string, TimeStampFormat format ) throws TimeStampParseException { long posixMillis = secondsToMillis( format.parse( string ) ); return new TimeStampPosixMillisInt64( posixMillis ); } public TimeStampPosixMillisInt64 currentTime( ) { return new TimeStampPosixMillisInt64( System.currentTimeMillis( ) ); } public TimeStampPosixMillisInt64 posixEpoch( ) { return Instances.posixEpoch; } }; protected final long posixMillis; protected TimeStampPosixMillisInt64( long posixMillis ) { this.posixMillis = posixMillis; } @Override public TimeStampPosixMillisInt64 add( double duration ) { return new TimeStampPosixMillisInt64( posixMillis + Math.round( Time.toMilliseconds( duration ) ) ); } @Override public TimeStampPosixMillisInt64 subtract( double duration ) { return new TimeStampPosixMillisInt64( posixMillis - Math.round( Time.toMilliseconds( duration ) ) ); } @Override public double durationBefore( TimeStamp o ) { if ( o instanceof TimeStampPosixMillisInt64 ) return Time.fromMilliseconds( ( ( TimeStampPosixMillisInt64 ) o ).posixMillis - posixMillis ); return super.durationBefore( o ); } @Override public double durationAfter( TimeStamp o ) { if ( o instanceof TimeStampPosixMillisInt64 ) return Time.fromMilliseconds( posixMillis - ( ( TimeStampPosixMillisInt64 ) o ).posixMillis ); return super.durationAfter( o ); } @Override public double toPosixSeconds( ) { return posixMillis * millisToSeconds; } @Override public long toPosixMillis( ) { return posixMillis; } @Override public long toPosixMicros( ) { return posixMillis * millisToMicros; } @Override public long toPosixNanos( ) { return posixMillis * millisToNanos; } @Override public Date toDate( ) { return new Date( posixMillis ); } @Override public Calendar toCalendar( ) { Calendar calendar = Calendar.getInstance( ); calendar.setTimeInMillis( posixMillis ); return calendar; } @Override public BigDecimal toPosixSecondsExact( ) { return BigDecimal.valueOf( posixMillis, millisDecimalScale ); } @Override public boolean isBefore( TimeStamp o ) { if ( o instanceof TimeStampPosixMillisInt64 ) return posixMillis < ( ( TimeStampPosixMillisInt64 ) o ).posixMillis; return super.isBefore( o ); } @Override public boolean isAfter( TimeStamp o ) { if ( o instanceof TimeStampPosixMillisInt64 ) return posixMillis > ( ( TimeStampPosixMillisInt64 ) o ).posixMillis; return super.isAfter( o ); } @Override public int compareTo( TimeStamp o ) { if ( o instanceof TimeStampPosixMillisInt64 ) return compareLongs( posixMillis, ( ( TimeStampPosixMillisInt64 ) o ).posixMillis ); return super.compareTo( o ); } protected static final int compareLongs( long a, long b ) { if ( a < b ) return -1; if ( a > b ) return +1; return 0; } protected static final long secondsToMillis( BigDecimal seconds ) { BigDecimal millis = seconds.scaleByPowerOfTen( millisDecimalScale ); return millis.setScale( 0, BigDecimal.ROUND_HALF_UP ).longValue( ); } @Override public boolean equals( Object o ) { if ( o == this ) return true; if ( o instanceof TimeStampPosixMillisInt64 ) return ( posixMillis == ( ( TimeStampPosixMillisInt64 ) o ).posixMillis ); return super.equals( o ); } @Override public int hashCode( ) { return 31 + GeneralUtils.hashCode( posixMillis ); } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy