package com.ldbc.driver.temporal;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
import java.util.concurrent.TimeUnit;
import static java.lang.String.format;
public class TemporalUtil
{
private final SimpleDateFormat timeFormat;
private final SimpleDateFormat dateTimeFormat;
public TemporalUtil()
{
timeFormat = new SimpleDateFormat( "HH:mm:ss.SSS" );
timeFormat.setTimeZone( TimeZone.getTimeZone( "GMT" ) );
dateTimeFormat = new SimpleDateFormat( "yyyy-MM-dd - HH:mm:ss.SSS" );
dateTimeFormat.setTimeZone( TimeZone.getTimeZone( "GMT" ) );
}
public String milliTimeToTimeString( long timeAsMilli )
{
return timeFormat.format( new Date( timeAsMilli ) );
}
public String milliTimeToDateTimeString( long timeAsMilli )
{
return dateTimeFormat.format( new Date( timeAsMilli ) );
}
public String milliDurationToString( long durationAsMilli )
{
return nanoDurationToString( TimeUnit.MILLISECONDS.toNanos( durationAsMilli ), false );
}
public String nanoDurationToString( long durationAsNano )
{
return nanoDurationToString( durationAsNano, true );
}
private String nanoDurationToString( long durationAsNano, boolean detailed )
{
long h = TimeUnit.NANOSECONDS.toHours( durationAsNano );
if ( h > 0 )
{
long m = TimeUnit.NANOSECONDS.toMinutes( durationAsNano ) - TimeUnit.HOURS.toMinutes( h );
long s = TimeUnit.NANOSECONDS.toSeconds( durationAsNano ) - TimeUnit.HOURS.toSeconds( h ) -
TimeUnit.MINUTES.toSeconds( m );
long ms = TimeUnit.NANOSECONDS.toMillis( durationAsNano ) - TimeUnit.HOURS.toMillis( h ) -
TimeUnit.MINUTES.toMillis( m ) - TimeUnit.SECONDS.toMillis( s );
if ( detailed )
{
long us = TimeUnit.NANOSECONDS.toMicros( durationAsNano ) - TimeUnit.HOURS.toMicros( h ) -
TimeUnit.MINUTES.toMicros( m ) - TimeUnit.SECONDS.toMicros( s ) -
TimeUnit.MILLISECONDS.toMicros( ms );
return format( "%02d:%02d:%02d.%03d.%03d (h:m:s.ms.us)", h, m, s, ms, us );
}
else
{
return format( "%02d:%02d:%02d.%03d (h:m:s.ms)", h, m, s, ms );
}
}
else
{
long m = TimeUnit.NANOSECONDS.toMinutes( durationAsNano );
long s = TimeUnit.NANOSECONDS.toSeconds( durationAsNano ) - TimeUnit.MINUTES.toSeconds( m );
long ms = TimeUnit.NANOSECONDS.toMillis( durationAsNano ) - TimeUnit.MINUTES.toMillis( m ) -
TimeUnit.SECONDS.toMillis( s );
if ( detailed )
{
long us = TimeUnit.NANOSECONDS.toMicros( durationAsNano ) - TimeUnit.MINUTES.toMicros( m ) -
TimeUnit.SECONDS.toMicros( s ) - TimeUnit.MILLISECONDS.toMicros( ms );
return format( "%02d:%02d.%03d.%03d (m:s.ms.us)", m, s, ms, us );
}
else
{
return format( "%02d:%02d.%03d (m:s.ms)", m, s, ms );
}
}
}
public String abbreviatedTimeUnit( TimeUnit unit )
{
switch ( unit )
{
case NANOSECONDS:
{
return "ns";
}
case MICROSECONDS:
{
return "us";
}
case MILLISECONDS:
{
return "ms";
}
case SECONDS:
{
return "s";
}
case MINUTES:
{
return "m";
}
case HOURS:
{
return "h";
}
case DAYS:
{
return "d";
}
default:
{
return unit.name();
}
}
}
}