/** Extracts a time unit from a UNIX date (milliseconds since epoch). */ public static int unixTimestampExtract(TimeUnitRange range, long timestamp) { return unixTimeExtract(range, (int) floorMod(timestamp, MILLIS_PER_DAY)); }
public static long unixTimestamp(int year, int month, int day, int hour, int minute, int second) { final int date = ymdToUnixDate(year, month, day); return (long) date * MILLIS_PER_DAY + (long) hour * MILLIS_PER_HOUR + (long) minute * MILLIS_PER_MINUTE + (long) second * MILLIS_PER_SECOND; }
public static long unixTimestampFloor(TimeUnitRange range, long timestamp) { int date = (int) (timestamp / MILLIS_PER_DAY); final int f = julianDateFloor(range, date + EPOCH_JULIAN, true); return (long) f * MILLIS_PER_DAY; }
public static int subtractMonths(long t0, long t1) { final long millis0 = DateTimeUtils.floorMod(t0, DateTimeUtils.MILLIS_PER_DAY); final int d0 = (int) DateTimeUtils.floorDiv(t0 - millis0, DateTimeUtils.MILLIS_PER_DAY); final long millis1 = DateTimeUtils.floorMod(t1, DateTimeUtils.MILLIS_PER_DAY); final int d1 = (int) DateTimeUtils.floorDiv(t1 - millis1, DateTimeUtils.MILLIS_PER_DAY); int x = subtractMonths(d0, d1); final long d2 = addMonths(d1, x); if (d2 == d0 && millis0 < millis1) { --x; } return x; }
/** Returns the first day of the first week of a year. * Per ISO-8601 it is the Monday of the week that contains Jan 4, * or equivalently, it is a Monday between Dec 29 and Jan 4. * Sometimes it is in the year before the given year. */ private static long firstMondayOfFirstWeek(int year) { final long janFirst = ymdToJulian(year, 1, 1); final long janFirstDow = floorMod(janFirst + 1, 7); // sun=0, sat=6 return janFirst + (11 - janFirstDow) % 7 - 3; }
/** Adds a given number of months to a timestamp, represented as the number * of milliseconds since the epoch. */ public static long addMonths(long timestamp, int m) { final long millis = DateTimeUtils.floorMod(timestamp, DateTimeUtils.MILLIS_PER_DAY); timestamp -= millis; final long x = addMonths((int) (timestamp / DateTimeUtils.MILLIS_PER_DAY), m); return x * DateTimeUtils.MILLIS_PER_DAY + millis; }
/** Resets to epoch (1970-01-01) the "date" part of a timestamp. */ public static long resetDate(long timestamp) { return floorMod(timestamp, MILLIS_PER_DAY); }
/** Modulo, always returning a non-negative result. */ public static long floorMod(long x, long y) { return x - floorDiv(x, y) * y; }
/** Helper for CAST({timestamp} AS VARCHAR(n)). */ public static String unixTimeToString(int time) { return unixTimeToString(time, 0); }
/** Helper for CAST({timestamp} AS VARCHAR(n)). */ public static String unixTimestampToString(long timestamp) { return unixTimestampToString(timestamp, 0); }
public static int ymdToUnixDate(int year, int month, int day) { final int julian = ymdToJulian(year, month, day); return julian - EPOCH_JULIAN; }
public static int timeStringToUnixDate(String v) { return timeStringToUnixDate(v, 0); }
public static StringBuilder number(StringBuilder buf, int v, int n) { for (int k = digitCount(v); k < n; k++) { buf.append('0'); } return buf.append(v); }
private static void unixDateToString(StringBuilder buf, int date) { julianToString(buf, date + EPOCH_JULIAN); }
public static long unixDateExtract(TimeUnitRange range, long date) { return julianExtract(range, (int) date + EPOCH_JULIAN); }
private static void fraction(StringBuilder buf, int scale, long ms) { if (scale > 0) { buf.append('.'); long v1 = scale == 3 ? ms : scale == 2 ? ms / 10 : scale == 1 ? ms / 100 : 0; number(buf, (int) v1, scale); } }
public static String unixTimeToString(int time, int precision) { final StringBuilder buf = new StringBuilder(8); unixTimeToString(buf, time, precision); return buf.toString(); }
public static long unixTimestampCeil(TimeUnitRange range, long timestamp) { int date = (int) (timestamp / MILLIS_PER_DAY); final int f = julianDateFloor(range, date + EPOCH_JULIAN, false); return (long) f * MILLIS_PER_DAY; }
public static long unixDateFloor(TimeUnitRange range, long date) { return julianDateFloor(range, (int) date + EPOCH_JULIAN, true); }
public static long unixDateCeil(TimeUnitRange range, long date) { return julianDateFloor(range, (int) date + EPOCH_JULIAN, true); }