public class TimestampUtils
extends java.lang.Object
Modifier and Type | Class and Description |
---|---|
(package private) static class |
TimestampUtils.Infinity |
private static class |
TimestampUtils.ParsedBinaryTimestamp |
private static class |
TimestampUtils.ParsedTimestamp |
Modifier and Type | Field and Description |
---|---|
private java.util.Calendar |
calCache |
private int |
calCacheZone |
private java.util.Calendar |
calendarWithUserTz |
private static java.lang.reflect.Field |
DEFAULT_TIME_ZONE_FIELD |
private java.util.TimeZone |
defaultTimeZoneCache |
private static java.util.HashMap<java.lang.String,java.util.TimeZone> |
GMT_ZONES |
private static java.time.LocalDateTime |
MAX_LOCAL_DATETIME |
private static int |
MAX_NANOS_BEFORE_WRAP_ON_ROUND |
private static java.time.OffsetDateTime |
MAX_OFFSET_DATETIME |
private static java.time.LocalTime |
MAX_TIME |
private static java.time.LocalDate |
MIN_LOCAL_DATE |
private static java.time.LocalDateTime |
MIN_LOCAL_DATETIME |
private static java.time.OffsetDateTime |
MIN_OFFSET_DATETIME |
private static char[][] |
NUMBERS |
private static java.time.Duration |
ONE_MICROSECOND |
private static int |
ONEDAY
Number of milliseconds in one day.
|
private java.util.TimeZone |
prevDefaultZoneFieldValue |
private java.lang.StringBuilder |
sbuf |
private Provider<java.util.TimeZone> |
timeZoneProvider |
private boolean |
usesDouble
True if the backend uses doubles for time values.
|
private java.util.TimeZone |
utcTz |
private static char[] |
ZEROS |
Constructor and Description |
---|
TimestampUtils(boolean usesDouble,
Provider<java.util.TimeZone> timeZoneProvider) |
Modifier and Type | Method and Description |
---|---|
private static void |
appendDate(java.lang.StringBuilder sb,
java.util.Calendar cal) |
private static void |
appendDate(java.lang.StringBuilder sb,
int year,
int month,
int day) |
private static void |
appendDate(java.lang.StringBuilder sb,
java.time.LocalDate localDate) |
private static void |
appendEra(java.lang.StringBuilder sb,
java.util.Calendar cal) |
private static void |
appendEra(java.lang.StringBuilder sb,
java.time.LocalDate localDate) |
private static void |
appendTime(java.lang.StringBuilder sb,
java.util.Calendar cal,
int nanos) |
private static void |
appendTime(java.lang.StringBuilder sb,
int hours,
int minutes,
int seconds,
int nanos)
Appends time part to the
StringBuilder in PostgreSQL-compatible format. |
private static void |
appendTime(java.lang.StringBuilder sb,
java.time.LocalTime localTime) |
private void |
appendTimeZone(java.lang.StringBuilder sb,
java.util.Calendar cal) |
private void |
appendTimeZone(java.lang.StringBuilder sb,
int offset) |
private void |
appendTimeZone(java.lang.StringBuilder sb,
java.time.ZoneOffset offset) |
private static char |
charAt(char[] s,
int pos) |
java.sql.Date |
convertToDate(long millis,
java.util.TimeZone tz)
Extracts the date part from a timestamp.
|
java.sql.Time |
convertToTime(long millis,
java.util.TimeZone tz)
Extracts the time part from a timestamp.
|
private static int |
firstNonDigit(char[] s,
int start) |
private static long |
floorDiv(long x,
long y) |
private static long |
floorMod(long x,
long y) |
private java.util.Calendar |
getCalendar(int sign,
int hr,
int min,
int sec) |
private java.util.TimeZone |
getDefaultTz() |
java.util.Calendar |
getSharedCalendar(java.util.TimeZone timeZone)
Get a shared calendar, applying the supplied time zone or the default time zone if null.
|
private long |
guessTimestamp(long millis,
java.util.TimeZone tz)
Given a UTC timestamp
millis finds another point in time that is rendered in given time
zone tz exactly as "millis in UTC". |
boolean |
hasFastDefaultTimeZone() |
private static boolean |
isSimpleTimeZone(java.lang.String id) |
private static boolean |
nanosExceed499(int nanos)
Returns true when microsecond part of the time should be increased
when rounding to microseconds
|
private static int |
number(char[] s,
int start,
int end) |
private TimestampUtils.ParsedTimestamp |
parseBackendTimestamp(java.lang.String str)
Load date/time information into the provided calendar returning the fractional seconds.
|
static java.util.TimeZone |
parseBackendTimeZone(java.lang.String timeZone)
Converts backend's TimeZone parameter to java format.
|
private java.util.Calendar |
setupCalendar(java.util.Calendar cal) |
private static int |
skipWhitespace(char[] s,
int start) |
java.lang.String |
timeToString(java.util.Date time,
boolean withTimeZone)
Returns the given time value as String matching what the current postgresql server would send
in text mode.
|
void |
toBinDate(java.util.TimeZone tz,
byte[] bytes,
java.sql.Date value)
Converts the SQL Date to binary representation for
Oid.DATE . |
java.sql.Date |
toDate(java.util.Calendar cal,
java.lang.String s) |
java.sql.Date |
toDateBin(java.util.TimeZone tz,
byte[] bytes)
Returns the SQL Date object matching the given bytes with
Oid.DATE . |
private static long |
toJavaSecs(long secs)
Converts the given postgresql seconds to java seconds.
|
java.time.LocalDateTime |
toLocalDateTime(java.lang.String s)
Parse a string and return a LocalDateTime representing its value.
|
java.time.LocalDateTime |
toLocalDateTimeBin(byte[] bytes)
Returns the local date time object matching the given bytes with
Oid.TIMESTAMP or
Oid.TIMESTAMPTZ . |
java.time.LocalTime |
toLocalTime(java.lang.String s)
Parse a string and return a LocalTime representing its value.
|
java.time.LocalTime |
toLocalTimeBin(byte[] bytes)
Returns the SQL Time object matching the given bytes with
Oid.TIME . |
java.time.OffsetDateTime |
toOffsetDateTime(java.lang.String s)
Parse a string and return a LocalDateTime representing its value.
|
java.time.OffsetDateTime |
toOffsetDateTime(java.sql.Time t)
Returns the offset date time object matching the given bytes with Oid#TIMETZ.
|
java.time.OffsetDateTime |
toOffsetDateTimeBin(byte[] bytes)
Returns the offset date time object matching the given bytes with Oid#TIMESTAMPTZ.
|
private TimestampUtils.ParsedBinaryTimestamp |
toParsedTimestampBin(java.util.TimeZone tz,
byte[] bytes,
boolean timestamptz) |
private TimestampUtils.ParsedBinaryTimestamp |
toParsedTimestampBinPlain(byte[] bytes) |
private static long |
toPgSecs(long secs)
Converts the given java seconds to postgresql seconds.
|
private TimestampUtils.ParsedBinaryTimestamp |
toProlepticParsedTimestampBin(byte[] bytes) |
java.lang.String |
toString(java.util.Calendar cal,
java.sql.Date x) |
java.lang.String |
toString(java.util.Calendar cal,
java.sql.Date x,
boolean withTimeZone) |
java.lang.String |
toString(java.util.Calendar cal,
java.sql.Time x) |
java.lang.String |
toString(java.util.Calendar cal,
java.sql.Time x,
boolean withTimeZone) |
java.lang.String |
toString(java.util.Calendar cal,
java.sql.Timestamp x) |
java.lang.String |
toString(java.util.Calendar cal,
java.sql.Timestamp x,
boolean withTimeZone) |
java.lang.String |
toString(java.time.LocalDate localDate) |
java.lang.String |
toString(java.time.LocalDateTime localDateTime)
Formats
LocalDateTime to be sent to the backend, thus it adds time zone. |
java.lang.String |
toString(java.time.LocalTime localTime) |
java.lang.String |
toString(java.time.OffsetDateTime offsetDateTime) |
java.sql.Time |
toTime(java.util.Calendar cal,
java.lang.String s) |
java.sql.Time |
toTimeBin(java.util.TimeZone tz,
byte[] bytes)
Returns the SQL Time object matching the given bytes with
Oid.TIME or
Oid.TIMETZ . |
java.sql.Timestamp |
toTimestamp(java.util.Calendar cal,
java.lang.String s)
Parse a string and return a timestamp representing its value.
|
java.sql.Timestamp |
toTimestampBin(java.util.TimeZone tz,
byte[] bytes,
boolean timestamptz)
Returns the SQL Timestamp object matching the given bytes with
Oid.TIMESTAMP or
Oid.TIMESTAMPTZ . |
private static final int ONEDAY
private static final char[] ZEROS
private static final char[][] NUMBERS
private static final java.util.HashMap<java.lang.String,java.util.TimeZone> GMT_ZONES
private static final int MAX_NANOS_BEFORE_WRAP_ON_ROUND
private static final java.time.Duration ONE_MICROSECOND
private static final java.time.LocalTime MAX_TIME
private static final java.time.OffsetDateTime MAX_OFFSET_DATETIME
private static final java.time.LocalDateTime MAX_LOCAL_DATETIME
private static final java.time.LocalDate MIN_LOCAL_DATE
private static final java.time.LocalDateTime MIN_LOCAL_DATETIME
private static final java.time.OffsetDateTime MIN_OFFSET_DATETIME
private static final java.lang.reflect.Field DEFAULT_TIME_ZONE_FIELD
private java.util.TimeZone prevDefaultZoneFieldValue
private java.util.TimeZone defaultTimeZoneCache
private final java.lang.StringBuilder sbuf
private final java.util.Calendar calendarWithUserTz
private final java.util.TimeZone utcTz
private java.util.Calendar calCache
private int calCacheZone
private final boolean usesDouble
private final Provider<java.util.TimeZone> timeZoneProvider
public TimestampUtils(boolean usesDouble, Provider<java.util.TimeZone> timeZoneProvider)
private java.util.Calendar getCalendar(int sign, int hr, int min, int sec)
private TimestampUtils.ParsedTimestamp parseBackendTimestamp(java.lang.String str) throws java.sql.SQLException
java.sql.SQLException
public java.sql.Timestamp toTimestamp(java.util.Calendar cal, java.lang.String s) throws java.sql.SQLException
cal
- calendar to be used to parse the input strings
- The ISO formated date string to parse.java.sql.SQLException
- if there is a problem parsing s.public java.time.LocalTime toLocalTime(java.lang.String s) throws java.sql.SQLException
s
- The ISO formated time string to parse.java.sql.SQLException
- if there is a problem parsing s.public java.time.LocalDateTime toLocalDateTime(java.lang.String s) throws java.sql.SQLException
s
- The ISO formated date string to parse.java.sql.SQLException
- if there is a problem parsing s.public java.time.OffsetDateTime toOffsetDateTime(java.lang.String s) throws java.sql.SQLException
s
- The ISO formated date string to parse.java.sql.SQLException
- if there is a problem parsing s.public java.time.OffsetDateTime toOffsetDateTime(java.sql.Time t)
t
- the time valuepublic java.time.OffsetDateTime toOffsetDateTimeBin(byte[] bytes) throws PSQLException
bytes
- The binary encoded local date time value.PSQLException
- If binary format could not be parsed.public java.sql.Time toTime(java.util.Calendar cal, java.lang.String s) throws java.sql.SQLException
java.sql.SQLException
public java.sql.Date toDate(java.util.Calendar cal, java.lang.String s) throws java.sql.SQLException
java.sql.SQLException
private java.util.Calendar setupCalendar(java.util.Calendar cal)
public java.util.Calendar getSharedCalendar(java.util.TimeZone timeZone)
timeZone
- time zone to be set for the calendarprivate static boolean nanosExceed499(int nanos)
nanos
- nanosecond part of the timepublic java.lang.String toString(java.util.Calendar cal, java.sql.Timestamp x)
public java.lang.String toString(java.util.Calendar cal, java.sql.Timestamp x, boolean withTimeZone)
public java.lang.String toString(java.util.Calendar cal, java.sql.Date x)
public java.lang.String toString(java.util.Calendar cal, java.sql.Date x, boolean withTimeZone)
public java.lang.String toString(java.util.Calendar cal, java.sql.Time x)
public java.lang.String toString(java.util.Calendar cal, java.sql.Time x, boolean withTimeZone)
private static void appendDate(java.lang.StringBuilder sb, java.util.Calendar cal)
private static void appendDate(java.lang.StringBuilder sb, int year, int month, int day)
private static void appendTime(java.lang.StringBuilder sb, java.util.Calendar cal, int nanos)
private static void appendTime(java.lang.StringBuilder sb, int hours, int minutes, int seconds, int nanos)
StringBuilder
in PostgreSQL-compatible format.
The function truncates to microseconds. The value is expected to be rounded
beforehand.sb
- destinationhours
- hoursminutes
- minutesseconds
- secondsnanos
- nanosecondsprivate void appendTimeZone(java.lang.StringBuilder sb, java.util.Calendar cal)
private void appendTimeZone(java.lang.StringBuilder sb, int offset)
private static void appendEra(java.lang.StringBuilder sb, java.util.Calendar cal)
public java.lang.String toString(java.time.LocalDate localDate)
public java.lang.String toString(java.time.LocalTime localTime)
public java.lang.String toString(java.time.OffsetDateTime offsetDateTime)
public java.lang.String toString(java.time.LocalDateTime localDateTime)
LocalDateTime
to be sent to the backend, thus it adds time zone.
Do not use this method in ResultSet.getString(int)
localDateTime
- The local date to format as a Stringprivate static void appendDate(java.lang.StringBuilder sb, java.time.LocalDate localDate)
private static void appendTime(java.lang.StringBuilder sb, java.time.LocalTime localTime)
private void appendTimeZone(java.lang.StringBuilder sb, java.time.ZoneOffset offset)
private static void appendEra(java.lang.StringBuilder sb, java.time.LocalDate localDate)
private static int skipWhitespace(char[] s, int start)
private static int firstNonDigit(char[] s, int start)
private static int number(char[] s, int start, int end)
private static char charAt(char[] s, int pos)
public java.sql.Date toDateBin(java.util.TimeZone tz, byte[] bytes) throws PSQLException
Oid.DATE
.tz
- The timezone used.bytes
- The binary encoded date value.PSQLException
- If binary format could not be parsed.private java.util.TimeZone getDefaultTz()
public boolean hasFastDefaultTimeZone()
public java.sql.Time toTimeBin(java.util.TimeZone tz, byte[] bytes) throws PSQLException
Oid.TIME
or
Oid.TIMETZ
.tz
- The timezone used when received data is Oid.TIME
, ignored if data already
contains Oid.TIMETZ
.bytes
- The binary encoded time value.PSQLException
- If binary format could not be parsed.public java.time.LocalTime toLocalTimeBin(byte[] bytes) throws PSQLException
Oid.TIME
.bytes
- The binary encoded time value.PSQLException
- If binary format could not be parsed.public java.sql.Timestamp toTimestampBin(java.util.TimeZone tz, byte[] bytes, boolean timestamptz) throws PSQLException
Oid.TIMESTAMP
or
Oid.TIMESTAMPTZ
.tz
- The timezone used when received data is Oid.TIMESTAMP
, ignored if data
already contains Oid.TIMESTAMPTZ
.bytes
- The binary encoded timestamp value.timestamptz
- True if the binary is in GMT.PSQLException
- If binary format could not be parsed.private TimestampUtils.ParsedBinaryTimestamp toParsedTimestampBinPlain(byte[] bytes) throws PSQLException
PSQLException
private TimestampUtils.ParsedBinaryTimestamp toParsedTimestampBin(java.util.TimeZone tz, byte[] bytes, boolean timestamptz) throws PSQLException
PSQLException
private TimestampUtils.ParsedBinaryTimestamp toProlepticParsedTimestampBin(byte[] bytes) throws PSQLException
PSQLException
public java.time.LocalDateTime toLocalDateTimeBin(byte[] bytes) throws PSQLException
Oid.TIMESTAMP
or
Oid.TIMESTAMPTZ
.bytes
- The binary encoded local date time value.PSQLException
- If binary format could not be parsed.private long guessTimestamp(long millis, java.util.TimeZone tz)
Given a UTC timestamp millis
finds another point in time that is rendered in given time
zone tz
exactly as "millis in UTC".
For instance, given 7 Jan 16:00 UTC and tz=GMT+02:00 it returns 7 Jan 14:00 UTC == 7 Jan 16:00
GMT+02:00 Note that is not trivial for timestamps near DST change. For such cases, we rely on
Calendar
to figure out the proper timestamp.
millis
- source timestamptz
- desired time zonetz
like millis
in UTCprivate static boolean isSimpleTimeZone(java.lang.String id)
public java.sql.Date convertToDate(long millis, java.util.TimeZone tz)
millis
- The timestamp from which to extract the date.tz
- The time zone of the date.public java.sql.Time convertToTime(long millis, java.util.TimeZone tz)
millis
- The timestamp from which to extract the time.tz
- timezone to use.public java.lang.String timeToString(java.util.Date time, boolean withTimeZone)
time
- time valuewithTimeZone
- whether timezone should be addedprivate static long toJavaSecs(long secs)
toPgSecs(long)
for the reverse operation.secs
- Postgresql seconds.private static long toPgSecs(long secs)
toJavaSecs(long)
for the reverse
operation. The conversion is valid for any year 100 BC onwards.secs
- Postgresql seconds.public void toBinDate(java.util.TimeZone tz, byte[] bytes, java.sql.Date value) throws PSQLException
Oid.DATE
.tz
- The timezone used.bytes
- The binary encoded date value.value
- valuePSQLException
- If binary format could not be parsed.public static java.util.TimeZone parseBackendTimeZone(java.lang.String timeZone)
timeZone
- time zone to useprivate static long floorDiv(long x, long y)
private static long floorMod(long x, long y)