📄 dateparser.java
字号:
* @param year The Gegorian year * @param month The month * @param day The day of the month <code>month</code> * @return the number of Julian days. */ private final long computeJulianDay(int year, int month, int day) { int y; long millis = 0; boolean isLeap = year%4 == 0; y = year - 1; long julianDay = 365L*y + floorDivide(y, 4) + (JAN_1_1_JULIAN_DAY - 3); isLeap = isLeap && ((year%100 != 0) || (year%400 == 0)); // Add 2 because Gregorian calendar starts 2 days after Julian calendar julianDay += floorDivide(y, 400) - floorDivide(y, 100) + 2; julianDay += isLeap ? LEAP_NUM_DAYS[month] : NUM_DAYS[month]; julianDay += day; return julianDay; } /** * Divide two long integers, returning the floor of the quotient. * <p> * Unlike the built-in division, this is mathematically well-behaved. * E.g., <code>-1/4</code> => 0 * but <code>floorDivide(-1,4)</code> => -1. * @param numerator the numerator * @param denominator a divisor which must be > 0 * @return the floor of the quotient. */ private static final long floorDivide(long numerator, long denominator) { // We do this computation in order to handle // a numerator of Long.MIN_VALUE correctly return (numerator >= 0) ? numerator / denominator : ((numerator + 1) / denominator) - 1; } // public String toString() { // return "" + month + "/" + day + "/" + year // + " " + hour + ":" + minute + ":" + second; // } /** * Convert the Julian day, <code>julian</code> into milliseconds. * * @param julian Number of days since Jan 1, year 1 (Julian). * @return the number of millis since the 01/01/1970. */ private long julianDayToMillis(long julian) { return (julian - julianDayOffset) * millisPerDay; } /** * Parse the date string <code>s</code> * * @param s a string representation of the date. */ private void internalParse(String s) { int year = -1; int mon = -1; int mday = -1; int hour = -1; int min = -1; int sec = -1; int millis = -1; int c = -1; int i = 0; int n = -1; int wst = -1; int tzoffset = -1; int prevc = 0; syntax: { if (s == null) break syntax; int limit = s.length(); while (i < limit) { c = s.charAt(i); i++; if (c <= ' ' || c == ',') continue; if (c == '(') { // skip comments int depth = 1; while (i < limit) { c = s.charAt(i); i++; if (c == '(') depth++; else if (c == ')') if (--depth <= 0) break; } continue; } if ('0' <= c && c <= '9') { n = c - '0'; while (i < limit && '0' <= (c = s.charAt(i)) && c <= '9') { n = n * 10 + c - '0'; i++; } if (prevc == '+' || prevc == '-' && year >= 0) { // timezone offset if (n < 24) n = n * 60; // EG. "GMT-3" else n = n % 100 + n / 100 * 60; // eg "GMT-0430" if (prevc == '+') // plus means east of GMT n = -n; if (tzoffset != 0 && tzoffset != -1) break syntax; tzoffset = n; } else if (n >= 70) if (year >= 0) break syntax; else if (c <= ' ' || c == ',' || c == '/' || i >= limit) // year = n < 1900 ? n : n - 1900; year = n < 100 ? n + 1900 : n; else break syntax; else if (c == ':') if (hour < 0) hour = (byte) n; else if (min < 0) min = (byte) n; else break syntax; else if (c == '/') if (mon < 0) mon = (byte) (n - 1); else if (mday < 0) mday = (byte) n; else break syntax; else if (i < limit && c != ',' && c > ' ' && c != '-') break syntax; else if (hour >= 0 && min < 0) min = (byte) n; else if (min >= 0 && sec < 0) sec = (byte) n; else if (mday < 0) mday = (byte) n; else break syntax; prevc = 0; } else if (c == '/' || c == ':' || c == '+' || c == '-') prevc = c; else { int st = i - 1; while (i < limit) { c = s.charAt(i); if (!('A' <= c && c <= 'Z' || 'a' <= c && c <= 'z')) break; i++; } if (i <= st + 1) break syntax; int k; for (k = wtb.length; --k >= 0; ) if (wtb[k].regionMatches(true, 0, s, st, i - st)) { int action = ttb[k]; if (action != 0) { if (action == 1) { // pm if (hour > 12 || hour < 1) break syntax; else if (hour < 12) hour += 12; } else if (action == 14) { // am if (hour > 12 || hour < 1) break syntax; else if (hour == 12) hour = 0; } else if (action <= 13) { // month! if (mon < 0) mon = (byte) (action - 2); else break syntax; } else { tzoffset = action - 10000; } } break; } if (k < 0) break syntax; prevc = 0; } } if (year < 1583 || mon < 0 || mday < 0) break syntax; if (sec < 0) sec = 0; if (min < 0) min = 0; if (hour < 0) hour = 0; this.year = year; month = mon; day = mday; this.hour = hour; this.tzoffset = -tzoffset * 60 * 1000; minute = min; second = sec; milli = 0; return; } // syntax error throw new IllegalArgumentException(); } /** A table of valid timezones */ private static Hashtable timezones; /** Number of days in each month in a non leap year */ private int[] days_in_month = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; /** Short versions of the month strings */ private String[] month_shorts = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; /** Short versions of the weekday strings */ private String[] weekday_shorts = {"Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"}; /** Offset from Jan 1, year 1 (Julian) and Jan 1, 1970 */ private static long julianDayOffset = 2440588; /** Number of milliseconds per hour */ private static int millisPerHour = 60 * 60 * 1000; /** Number of milliseconds per day */ private static int millisPerDay = 24 * millisPerHour; /** Jan 1, year 1 (Gregorian) */ private static final int JAN_1_1_JULIAN_DAY = 1721426; /** All of the valid strings for the date */ private final static String wtb[] = { "am", "pm", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday", "january", "february", "march", "april", "may", "june", "july", "august", "september", "october", "november", "december", "gmt", "ut", "utc", "est", "edt", "cst", "cdt", "mst", "mdt", "pst", "pdt" // this time zone table needs to be expanded }; /** * Used to process date strings. Each value coresponds to a string * in the wtb variable. */ private final static int ttb[] = { 14, 1, 0, 0, 0, 0, 0, 0, 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 10000 + 0, 10000 + 0, 10000 + 0, // GMT/UT/UTC 10000 + 5 * 60, 10000 + 4 * 60, // EST/EDT 10000 + 6 * 60, 10000 + 5 * 60, 10000 + 7 * 60, 10000 + 6 * 60, 10000 + 8 * 60, 10000 + 7 * 60 }; /** Cummulative number of days for each month in a non leap year. */ private static final int NUM_DAYS[] = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334}; /** Cummulative number of days for each month in a leap year. */ private static final int LEAP_NUM_DAYS[] = { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335}; static { timezones = new Hashtable(); timezones.put("GMT", new Integer(0 * millisPerHour)); timezones.put("UT", new Integer(0 * millisPerHour)); timezones.put("UTC", new Integer(0 * millisPerHour)); timezones.put("PST", new Integer(-8 * millisPerHour)); timezones.put("PDT", new Integer(-7 * millisPerHour)); timezones.put("JST", new Integer(9 * millisPerHour)); local_tz = ((Integer)timezones.get("PST")).intValue(); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -