| /** |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package org.apache.tajo.util.datetime; |
| |
| import java.util.HashMap; |
| import java.util.Map; |
| |
| public class DateTimeConstants { |
| public enum DateStyle { |
| XSO_DATES, |
| ISO_DATES, |
| SQL_DATES |
| }; |
| |
| public static final int[][] DAY_OF_MONTH = { |
| {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 0}, |
| {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 0} |
| }; |
| |
| /** assumes leap year every four years */ |
| public static final double DAYS_PER_YEAR = 365.25; |
| public static final int MONTHS_PER_YEAR = 12; |
| |
| |
| // DAYS_PER_MONTH is very imprecise. The more accurate value is |
| // 365.2425/12 = 30.436875, or '30 days_full 10:29:06'. Right now we only |
| // return an integral number of days_full, but someday perhaps we should |
| // also return a 'time' value to be used as well. ISO 8601 suggests |
| // 0 days_full. |
| |
| /** assumes exactly 30 days_full per month */ |
| public static final int DAYS_PER_MONTH = 30; |
| /** assume no daylight savings time changes */ |
| public static final int HOURS_PER_DAY = 24; |
| |
| // This doesn't adjust for uneven daylight savings time intervals or leap |
| // seconds, and it crudely estimates leap years. A more accurate value |
| // for days_full per years is 365.2422. |
| |
| /** avoid floating-point computation */ |
| public static final int SECS_PER_YEAR = 36525 * 864; |
| public static final int SECS_PER_DAY = 86_400; |
| public static final int SECS_PER_HOUR = 3600; |
| public static final int SECS_PER_MINUTE = 60; |
| public static final int MINS_PER_HOUR = 60; |
| |
| public static final long MSECS_PER_DAY = 86_400_000L; |
| public static final long MSECS_PER_SEC = 1000L; |
| |
| public static final long USECS_PER_DAY = 86_400_000_000L; |
| public static final long USECS_PER_HOUR = 3_600_000_000L; |
| public static final long USECS_PER_MINUTE = 60_000_000L; |
| public static final long USECS_PER_SEC = 1_000_000L; |
| public static final long USECS_PER_MSEC = 1000L; |
| |
| public static final int JULIAN_MINYEAR = -4713; |
| public static final int JULIAN_MINMONTH = 11; |
| public static final int JULIAN_MINDAY = 24; |
| public static final int JULIAN_MAXYEAR = 5874898; |
| |
| /** == DateTimeUtil.toJulianDate(JULIAN_MAXYEAR, 1, 1) */ |
| public static final int JULIAN_MAX = 2147483494; |
| |
| /** the first ISO day of week */ |
| public static final int MONDAY = 1; |
| |
| /** the second ISO day of week */ |
| public static final int TUESDAY = 2; |
| |
| /** the third ISO day of week */ |
| public static final int WEDNESDAY = 3; |
| |
| /** the fourth ISO day of week */ |
| public static final int THURSDAY = 4; |
| |
| /** the fifth ISO day of week */ |
| public static final int FRIDAY = 5; |
| |
| /** the sixth ISO day of week */ |
| public static final int SATURDAY = 6; |
| |
| /** the seventh ISO day of week */ |
| public static final int SUNDAY = 7; |
| |
| // Julian-date equivalents of Day 0 in Unix and Postgres reckoning |
| /** == DateTimeUtil.toJulianDate(1970, 1, 1) */ |
| public static final int UNIX_EPOCH_JDATE = 2_440_588; |
| /** == DateTimeUtil.toJulianDate(2000, 1, 1) */ |
| public static final int POSTGRES_EPOCH_JDATE = 2_451_545; |
| /** == (POSTGRES_EPOCH_JDATE * SECS_PER_DAY) - (UNIX_EPOCH_JDATE * SECS_PER_DAY); */ |
| public static final long SECS_DIFFERENCE_BETWEEN_JULIAN_AND_UNIXTIME = 946_684_800; |
| |
| public static final int MAX_TZDISP_HOUR = 15; /* maximum allowed hour part */ |
| public static final int TZDISP_LIMIT = ((MAX_TZDISP_HOUR + 1) * SECS_PER_HOUR); |
| |
| public static final int INTERVAL_FULL_RANGE = 0x7FFF; |
| |
| public static final String DAGO = "ago"; |
| public static final String DCURRENT = "current"; |
| public static final String EPOCH = "epoch"; |
| public static final String INVALID = "invalid"; |
| public static final String EARLY = "-infinity"; |
| public static final String LATE = "infinity"; |
| public static final String NOW = "now"; |
| public static final String TODAY = "today"; |
| public static final String TOMORROW = "tomorrow"; |
| public static final String YESTERDAY = "yesterday"; |
| public static final String ZULU = "zulu"; |
| |
| public static final String DMICROSEC = "usecond"; |
| public static final String DMILLISEC = "msecond"; |
| public static final String DSECOND = "second"; |
| public static final String DMINUTE = "minute"; |
| public static final String DHOUR = "hour"; |
| public static final String DDAY = "day"; |
| public static final String DWEEK = "week"; |
| public static final String DMONTH = "month"; |
| public static final String DQUARTER = "quarter"; |
| public static final String DYEAR = "year"; |
| public static final String DDECADE = "decade"; |
| public static final String DCENTURY = "century"; |
| public static final String DMILLENNIUM = "millennium"; |
| public static final String DA_D = "ad"; |
| public static final String DB_C = "bc"; |
| public static final String DTIMEZONE = "timezone"; |
| |
| public static final int DATEORDER_YMD = 0; |
| public static final int DATEORDER_DMY = 1; |
| public static final int DATEORDER_MDY = 2; |
| |
| public static enum TokenField { |
| DECIMAL(0), |
| |
| AM(0), PM(1), HR24(2), |
| |
| AD(0), BC(1), |
| |
| DTK_NUMBER(0), |
| DTK_STRING(1), |
| |
| DTK_DATE(2), |
| DTK_TIME(3), |
| DTK_TZ(4), |
| DTK_AGO(5), |
| |
| DTK_SPECIAL(6), |
| DTK_INVALID(7), |
| DTK_CURRENT(8), |
| DTK_EARLY(9), |
| DTK_LATE(10), |
| DTK_EPOCH(11), |
| DTK_NOW(12), |
| DTK_YESTERDAY(13), |
| DTK_TODAY(14), |
| DTK_TOMORROW(15), |
| DTK_ZULU(16), |
| |
| DTK_DELTA(17), |
| DTK_SECOND(18), |
| DTK_MINUTE(19), |
| DTK_HOUR(20), |
| DTK_DAY(21), |
| DTK_WEEK(22), |
| DTK_MONTH(23), |
| DTK_QUARTER(24), |
| DTK_YEAR(25), |
| DTK_DECADE(26), |
| DTK_CENTURY(27), |
| DTK_MILLENNIUM(28), |
| DTK_MILLISEC(29), |
| DTK_MICROSEC(30), |
| DTK_JULIAN(31), |
| |
| DTK_DOW(32), |
| DTK_DOY(33), |
| DTK_TZ_HOUR(34), |
| DTK_TZ_MINUTE(35), |
| DTK_ISOYEAR(36), |
| DTK_ISODOW(37), |
| |
| RESERV(0), |
| MONTH(1), |
| YEAR(2), |
| DAY(3), |
| JULIAN(4), |
| TZ(5), |
| DTZ(6), |
| DTZMOD(7), |
| IGNORE_DTF(8), |
| AMPM(9), |
| HOUR(10), |
| MINUTE(11), |
| SECOND(12), |
| MILLISECOND(13), |
| MICROSECOND(14), |
| DOY(15), |
| DOW(16), |
| UNITS(17), |
| ADBC(18), |
| /* these are only for relative dates */ |
| AGO(19), |
| ABS_BEFORE(20), |
| ABS_AFTER(21), |
| /* generic fields to help with parsing */ |
| ISODATE(22), |
| ISOTIME(23), |
| /* these are only for parsing intervals */ |
| WEEK(24), |
| DECADE(25), |
| CENTURY(26), |
| MILLENNIUM(27), |
| /* reserved for unrecognized string values */ |
| UNKNOWN_FIELD(28); |
| |
| int value; |
| TokenField(int value) { |
| this.value = value; |
| } |
| |
| public int getValue() { |
| return value; |
| } |
| } |
| |
| static Object datetktbl[][] = { |
| /* text, token, lexval */ |
| {"-infinity", TokenField.RESERV, TokenField.DTK_EARLY}, /* "-infinity" reserved for "early time" */ |
| {"acsst", TokenField.DTZ, 42}, /* Cent. Australia */ |
| {"acst", TokenField.DTZ, -16}, /* Atlantic/Porto Acre */ |
| {"act", TokenField.TZ, -20}, /* Atlantic/Porto Acre */ |
| {DA_D, TokenField.ADBC, TokenField.AD}, /* "ad" for years >= 0 */ |
| {"adt", TokenField.DTZ, -12}, /* Atlantic Daylight Time */ |
| {"aesst", TokenField.DTZ, 44}, /* E. Australia */ |
| {"aest", TokenField.TZ, 40}, /* Australia Eastern Std Time */ |
| {"aft", TokenField.TZ, 18}, /* Kabul */ |
| {"ahst", TokenField.TZ, -40}, /* Alaska-Hawaii Std Time */ |
| {"akdt", TokenField.DTZ, -32}, /* Alaska Daylight Time */ |
| {"akst", TokenField.DTZ, -36}, /* Alaska Standard Time */ |
| {"allballs", TokenField.RESERV, TokenField.DTK_ZULU}, /* 00:00:00 */ |
| {"almst", TokenField.TZ, 28}, /* Almaty Savings Time */ |
| {"almt", TokenField.TZ, 24}, /* Almaty Time */ |
| {"am", TokenField.AMPM, TokenField.AM}, |
| {"amst", TokenField.DTZ, 20}, /* Armenia Summer Time (Yerevan) */ |
| {"amt", TokenField.TZ, 16}, /* Armenia Time (Yerevan) */ |
| {"anast", TokenField.DTZ, 52}, /* Anadyr Summer Time (Russia) */ |
| {"anat", TokenField.TZ, 48}, /* Anadyr Time (Russia) */ |
| {"apr", TokenField.MONTH, 4}, |
| {"april", TokenField.MONTH, 4}, |
| {"art", TokenField.TZ, -12}, /* Argentina Time */ |
| {"ast", TokenField.TZ, -16}, /* Atlantic Std Time (Canada) */ |
| {"at", TokenField.IGNORE_DTF, 0}, /* "at" (throwaway) */ |
| {"aug", TokenField.MONTH, 8}, |
| {"august", TokenField.MONTH, 8}, |
| {"awsst", TokenField.DTZ, 36}, /* W. Australia */ |
| {"awst", TokenField.TZ, 32}, /* W. Australia */ |
| {"awt", TokenField.DTZ, -12}, |
| {"azost", TokenField.DTZ, 0}, /* Azores Summer Time */ |
| {"azot", TokenField.TZ, -4}, /* Azores Time */ |
| {"azst", TokenField.DTZ, 20}, /* Azerbaijan Summer Time */ |
| {"azt", TokenField.TZ, 16}, /* Azerbaijan Time */ |
| {DB_C, TokenField.ADBC, TokenField.BC}, /* "bc" for years < 0 */ |
| {"bdst", TokenField.TZ, 8}, /* British Double Summer Time */ |
| {"bdt", TokenField.TZ, 24}, /* Dacca */ |
| {"bnt", TokenField.TZ, 32}, /* Brunei Darussalam Time */ |
| {"bort", TokenField.TZ, 32}, /* Borneo Time (Indonesia) */ |
| {"bot", TokenField.TZ, -16}, /* Bolivia Time */ |
| {"bra", TokenField.TZ, -12}, /* Brazil Time */ |
| {"bst", TokenField.DTZ, 4}, /* British Summer Time */ |
| {"bt", TokenField.TZ, 12}, /* Baghdad Time */ |
| {"btt", TokenField.TZ, 24}, /* Bhutan Time */ |
| {"cadt", TokenField.DTZ, 42}, /* Central Australian DST */ |
| {"cast", TokenField.TZ, 38}, /* Central Australian ST */ |
| {"cat", TokenField.TZ, -40}, /* Central Alaska Time */ |
| {"cct", TokenField.TZ, 32}, /* China Coast Time */ |
| {"cdt", TokenField.DTZ, -20}, /* Central Daylight Time */ |
| {"cest", TokenField.DTZ, 8}, /* Central European Dayl.Time */ |
| {"cet", TokenField.TZ, 4}, /* Central European Time */ |
| {"cetdst", TokenField.DTZ, 8}, /* Central European Dayl.Time */ |
| {"chadt", TokenField.DTZ, 55}, /* Chatham Island Daylight Time (13:45) */ |
| {"chast", TokenField.TZ, 51}, /* Chatham Island Time (12:45) */ |
| {"ckt", TokenField.TZ, 48}, /* Cook Islands Time */ |
| {"clst", TokenField.DTZ, -12}, /* Chile Summer Time */ |
| {"clt", TokenField.TZ, -16}, /* Chile Time */ |
| {"cot", TokenField.TZ, -20}, /* Columbia Time */ |
| {"cst", TokenField.TZ, -24}, /* Central Standard Time */ |
| {DCURRENT, TokenField.RESERV, TokenField.DTK_CURRENT}, /* "current" is always now */ |
| {"cvt", TokenField.TZ, 28}, /* Christmas Island Time (Indian Ocean) */ |
| {"cxt", TokenField.TZ, 28}, /* Christmas Island Time (Indian Ocean) */ |
| {"d", TokenField.UNITS, TokenField.DTK_DAY}, /* "day of month" for ISO input */ |
| {"davt", TokenField.TZ, 28}, /* Davis Time (Antarctica) */ |
| {"ddut", TokenField.TZ, 40}, /* Dumont-d'Urville Time (Antarctica) */ |
| {"dec", TokenField.MONTH, 12}, |
| {"december", TokenField.MONTH, 12}, |
| {"dnt", TokenField.TZ, 4}, /* Dansk Normal Tid */ |
| {"dow", TokenField.RESERV, TokenField.DTK_DOW}, /* day of week */ |
| {"doy", TokenField.RESERV, TokenField.DTK_DOY}, /* day of year */ |
| {"dst", TokenField.DTZMOD, 6}, |
| {"easst", TokenField.DTZ, -20}, /* Easter Island Summer Time */ |
| {"east", TokenField.TZ, -24}, /* Easter Island Time */ |
| {"eat", TokenField.TZ, 12}, /* East Africa Time */ |
| {"edt", TokenField.DTZ, -16}, /* Eastern Daylight Time */ |
| {"eest", TokenField.DTZ, 12}, /* Eastern Europe Summer Time */ |
| {"eet", TokenField.TZ, 8}, /* East. Europe, USSR Zone 1 */ |
| {"eetdst", TokenField.DTZ, 12}, /* Eastern Europe Daylight Time */ |
| {"egst", TokenField.DTZ, 0}, /* East Greenland Summer Time */ |
| {"egt", TokenField.TZ, -4}, /* East Greenland Time */ |
| {EPOCH, TokenField.RESERV, TokenField.DTK_EPOCH}, /* "epoch" reserved for system epoch time */ |
| {"est", TokenField.TZ, -20}, /* Eastern Standard Time */ |
| {"feb", TokenField.MONTH, 2}, |
| {"february", TokenField.MONTH, 2}, |
| {"fjst", TokenField.DTZ, -52}, /* Fiji Summer Time (13 hour offset!) */ |
| {"fjt", TokenField.TZ, -48}, /* Fiji Time */ |
| {"fkst", TokenField.DTZ, -12}, /* Falkland Islands Summer Time */ |
| {"fkt", TokenField.TZ, -8}, /* Falkland Islands Time */ |
| {"fri", TokenField.DOW, 5}, |
| {"friday", TokenField.DOW, 5}, |
| {"fst", TokenField.TZ, 4}, /* French Summer Time */ |
| {"fwt", TokenField.DTZ, 8}, /* French Winter Time */ |
| {"galt", TokenField.TZ, -24}, /* Galapagos Time */ |
| {"gamt", TokenField.TZ, -36}, /* Gambier Time */ |
| {"gest", TokenField.DTZ, 20}, /* Georgia Summer Time */ |
| {"get", TokenField.TZ, 16}, /* Georgia Time */ |
| {"gft", TokenField.TZ, -12}, /* French Guiana Time */ |
| {"gilt", TokenField.TZ, 48}, /* Gilbert Islands Time */ |
| {"gmt", TokenField.TZ, 0}, /* Greenwish Mean Time */ |
| {"gst", TokenField.TZ, 40}, /* Guam Std Time, USSR Zone 9 */ |
| {"gyt", TokenField.TZ, -16}, /* Guyana Time */ |
| {"h", TokenField.UNITS, TokenField.DTK_HOUR}, /* "hour" */ |
| {"hdt", TokenField.DTZ, -36}, /* Hawaii/Alaska Daylight Time */ |
| {"hkt", TokenField.TZ, 32}, /* Hong Kong Time */ |
| {"hst", TokenField.TZ, -40}, /* Hawaii Std Time */ |
| {"ict", TokenField.TZ, 28}, /* Indochina Time */ |
| {"idle", TokenField.TZ, 48}, /* Intl. Date Line, East */ |
| {"idlw", TokenField.TZ, -48}, /* Intl. Date Line, West */ |
| {LATE, TokenField.RESERV, TokenField.DTK_LATE}, /* "infinity" reserved for "late time" */ |
| {INVALID, TokenField.RESERV, TokenField.DTK_INVALID}, /* "invalid" reserved for bad time */ |
| {"iot", TokenField.TZ, 20}, /* Indian Chagos Time */ |
| {"irkst", TokenField.DTZ, 36}, /* Irkutsk Summer Time */ |
| {"irkt", TokenField.TZ, 32}, /* Irkutsk Time */ |
| {"irt", TokenField.TZ, 14}, /* Iran Time */ |
| {"isodow", TokenField.RESERV, TokenField.DTK_ISODOW}, /* ISO day of week, Sunday == 7 */ |
| {"ist", TokenField.TZ, 8}, /* Israel */ |
| {"it", TokenField.TZ, 14}, /* Iran Time */ |
| {"j", TokenField.UNITS, TokenField.DTK_JULIAN}, |
| {"jan", TokenField.MONTH, 1}, |
| {"january", TokenField.MONTH, 1}, |
| {"javt", TokenField.TZ, 28}, /* Java Time (07:00? see JT) */ |
| {"jayt", TokenField.TZ, 36}, /* Jayapura Time (Indonesia) */ |
| {"jd", TokenField.UNITS, TokenField.DTK_JULIAN}, |
| {"jst", TokenField.TZ, 36}, /* Japan Std Time,USSR Zone 8 */ |
| {"jt", TokenField.TZ, 30}, /* Java Time (07:30? see JAVT) */ |
| {"jul", TokenField.MONTH, 7}, |
| {"julian", TokenField.UNITS, TokenField.DTK_JULIAN}, |
| {"july", TokenField.MONTH, 7}, |
| {"jun", TokenField.MONTH, 6}, |
| {"june", TokenField.MONTH, 6}, |
| {"kdt", TokenField.DTZ, 40}, /* Korea Daylight Time */ |
| {"kgst", TokenField.DTZ, 24}, /* Kyrgyzstan Summer Time */ |
| {"kgt", TokenField.TZ, 20}, /* Kyrgyzstan Time */ |
| {"kost", TokenField.TZ, 48}, /* Kosrae Time */ |
| {"krast", TokenField.DTZ, 28}, /* Krasnoyarsk Summer Time */ |
| {"krat", TokenField.TZ, 32}, /* Krasnoyarsk Standard Time */ |
| {"kst", TokenField.TZ, 36}, /* Korea Standard Time */ |
| {"lhdt", TokenField.DTZ, 44}, /* Lord Howe Daylight Time, Australia */ |
| {"lhst", TokenField.TZ, 42}, /* Lord Howe Standard Time, Australia */ |
| {"ligt", TokenField.TZ, 40}, /* From Melbourne, Australia */ |
| {"lint", TokenField.TZ, 56}, /* Line Islands Time (Kiribati; +14 hours!) */ |
| {"lkt", TokenField.TZ, 24}, /* Lanka Time */ |
| {"m", TokenField.UNITS, TokenField.DTK_MONTH}, /* "month" for ISO input */ |
| {"magst", TokenField.DTZ, 48}, /* Magadan Summer Time */ |
| {"magt", TokenField.TZ, 44}, /* Magadan Time */ |
| {"mar", TokenField.MONTH, 3}, |
| {"march", TokenField.MONTH, 3}, |
| {"mart", TokenField.TZ, -38}, /* Marquesas Time */ |
| {"mawt", TokenField.TZ, 24}, /* Mawson, Antarctica */ |
| {"may", TokenField.MONTH, 5}, |
| {"mdt", TokenField.DTZ, -24}, /* Mountain Daylight Time */ |
| {"mest", TokenField.DTZ, 8}, /* Middle Europe Summer Time */ |
| {"met", TokenField.TZ, 4}, /* Middle Europe Time */ |
| {"metdst", TokenField.DTZ, 8}, /* Middle Europe Daylight Time */ |
| {"mewt", TokenField.TZ, 4}, /* Middle Europe Winter Time */ |
| {"mez", TokenField.TZ, 4}, /* Middle Europe Zone */ |
| {"mht", TokenField.TZ, 48}, /* Kwajalein */ |
| {"mm", TokenField.UNITS, TokenField.DTK_MINUTE}, /* "minute" for ISO input */ |
| {"mmt", TokenField.TZ, 26}, /* Myannar Time */ |
| {"mon", TokenField.DOW, 1}, |
| {"monday", TokenField.DOW, 1}, |
| {"mpt", TokenField.TZ, 40}, /* North Mariana Islands Time */ |
| {"msd", TokenField.DTZ, 16}, /* Moscow Summer Time */ |
| {"msk", TokenField.TZ, 12}, /* Moscow Time */ |
| {"mst", TokenField.TZ, -28}, /* Mountain Standard Time */ |
| {"mt", TokenField.TZ, 34}, /* Moluccas Time */ |
| {"mut", TokenField.TZ, 16}, /* Mauritius Island Time */ |
| {"mvt", TokenField.TZ, 20}, /* Maldives Island Time */ |
| {"myt", TokenField.TZ, 32}, /* Malaysia Time */ |
| {"nct", TokenField.TZ, 44}, /* New Caledonia Time */ |
| {"ndt", TokenField.DTZ, -10}, /* Nfld. Daylight Time */ |
| {"nft", TokenField.TZ, -14}, /* Newfoundland Standard Time */ |
| {"nor", TokenField.TZ, 4}, /* Norway Standard Time */ |
| {"nov", TokenField.MONTH, 11}, |
| {"november", TokenField.MONTH, 11}, |
| {"novst", TokenField.DTZ, 28}, /* Novosibirsk Summer Time */ |
| {"novt", TokenField.TZ, 24}, /* Novosibirsk Standard Time */ |
| {NOW, TokenField.RESERV, TokenField.DTK_NOW}, /* current transaction time */ |
| {"npt", TokenField.TZ, 23}, /* Nepal Standard Time (GMT-5:45) */ |
| {"nst", TokenField.TZ, -14}, /* Nfld. Standard Time */ |
| {"nt", TokenField.TZ, -44}, /* Nome Time */ |
| {"nut", TokenField.TZ, -44}, /* Niue Time */ |
| {"nzdt", TokenField.DTZ, 52}, /* New Zealand Daylight Time */ |
| {"nzst", TokenField.TZ, 48}, /* New Zealand Standard Time */ |
| {"nzt", TokenField.TZ, 48}, /* New Zealand Time */ |
| {"oct", TokenField.MONTH, 10}, |
| {"october", TokenField.MONTH, 10}, |
| {"omsst", TokenField.DTZ, 28}, /* Omsk Summer Time */ |
| {"omst", TokenField.TZ, 24}, /* Omsk Time */ |
| {"on", TokenField.IGNORE_DTF, 0}, /* "on" (throwaway) */ |
| {"pdt", TokenField.DTZ, -28}, /* Pacific Daylight Time */ |
| {"pet", TokenField.TZ, -20}, /* Peru Time */ |
| {"petst", TokenField.DTZ, 52}, /* Petropavlovsk-Kamchatski Summer Time */ |
| {"pett", TokenField.TZ, 48}, /* Petropavlovsk-Kamchatski Time */ |
| {"pgt", TokenField.TZ, 40}, /* Papua New Guinea Time */ |
| {"phot", TokenField.TZ, 52}, /* Phoenix Islands (Kiribati) Time */ |
| {"pht", TokenField.TZ, 32}, /* Philippine Time */ |
| {"pkt", TokenField.TZ, 20}, /* Pakistan Time */ |
| {"pm", TokenField.AMPM, TokenField.PM}, |
| {"pmdt", TokenField.DTZ, -8}, /* Pierre & Miquelon Daylight Time */ |
| {"pont", TokenField.TZ, 44}, /* Ponape Time (Micronesia) */ |
| {"pst", TokenField.TZ, -32}, /* Pacific Standard Time */ |
| {"pwt", TokenField.TZ, 36}, /* Palau Time */ |
| {"pyst", TokenField.DTZ, -12}, /* Paraguay Summer Time */ |
| {"pyt", TokenField.TZ, -16}, /* Paraguay Time */ |
| {"ret", TokenField.DTZ, 16}, /* Reunion Island Time */ |
| {"s", TokenField.UNITS, TokenField.DTK_SECOND}, /* "seconds" for ISO input */ |
| {"sadt", TokenField.DTZ, 42}, /* S. Australian Dayl. Time */ |
| {"sast", TokenField.TZ, 38}, /* South Australian Std Time */ |
| {"sat", TokenField.DOW, 6}, |
| {"saturday", TokenField.DOW, 6}, |
| {"sct", TokenField.DTZ, 16}, /* Mahe Island Time */ |
| {"sep", TokenField.MONTH, 9}, |
| {"sept", TokenField.MONTH, 9}, |
| {"september", TokenField.MONTH, 9}, |
| {"set", TokenField.TZ, -4}, /* Seychelles Time ?? */ |
| {"sst", TokenField.DTZ, 8}, /* Swedish Summer Time */ |
| {"sun", TokenField.DOW, 0}, |
| {"sunday", TokenField.DOW, 0}, |
| {"swt", TokenField.TZ, 4}, /* Swedish Winter Time */ |
| {"t", TokenField.ISOTIME, TokenField.DTK_TIME}, /* Filler for ISO time fields */ |
| {"tft", TokenField.TZ, 20}, /* Kerguelen Time */ |
| {"that", TokenField.TZ, -40}, /* Tahiti Time */ |
| {"thu", TokenField.DOW, 4}, |
| {"thur", TokenField.DOW, 4}, |
| {"thurs", TokenField.DOW, 4}, |
| {"thursday", TokenField.DOW, 4}, |
| {"tjt", TokenField.TZ, 20}, /* Tajikistan Time */ |
| {"tkt", TokenField.TZ, -40}, /* Tokelau Time */ |
| {"tmt", TokenField.TZ, 20}, /* Turkmenistan Time */ |
| {TODAY, TokenField.RESERV, TokenField.DTK_TODAY}, /* midnight */ |
| {TOMORROW, TokenField.RESERV, TokenField.DTK_TOMORROW}, /* tomorrow midnight */ |
| {"truk", TokenField.TZ, 40}, /* Truk Time */ |
| {"tue", TokenField.DOW, 2}, |
| {"tues", TokenField.DOW, 2}, |
| {"tuesday", TokenField.DOW, 2}, |
| {"tvt", TokenField.TZ, 48}, /* Tuvalu Time */ |
| {"ulast", TokenField.DTZ, 36}, /* Ulan Bator Summer Time */ |
| {"ulat", TokenField.TZ, 32}, /* Ulan Bator Time */ |
| {"undefined", TokenField.RESERV, TokenField.DTK_INVALID}, /* pre-v6.1 invalid time */ |
| {"ut", TokenField.TZ, 0}, |
| {"utc", TokenField.TZ, 0}, |
| {"uyst", TokenField.DTZ, -8}, /* Uruguay Summer Time */ |
| {"uyt", TokenField.TZ, -12}, /* Uruguay Time */ |
| {"uzst", TokenField.DTZ, 24}, /* Uzbekistan Summer Time */ |
| {"uzt", TokenField.TZ, 20}, /* Uzbekistan Time */ |
| {"vet", TokenField.TZ, -16}, /* Venezuela Time */ |
| {"vlast", TokenField.DTZ, 44}, /* Vladivostok Summer Time */ |
| {"vlat", TokenField.TZ, 40}, /* Vladivostok Time */ |
| {"vut", TokenField.TZ, 44}, /* Vanuata Time */ |
| {"wadt", TokenField.DTZ, 32}, /* West Australian DST */ |
| {"wakt", TokenField.TZ, 48}, /* Wake Time */ |
| {"wast", TokenField.TZ, 28}, /* West Australian Std Time */ |
| {"wat", TokenField.TZ, -4}, /* West Africa Time */ |
| {"wdt", TokenField.DTZ, 36}, /* West Australian DST */ |
| {"wed", TokenField.DOW, 3}, |
| {"wednesday", TokenField.DOW, 3}, |
| {"weds", TokenField.DOW, 3}, |
| {"west", TokenField.DTZ, 4}, /* Western Europe Summer Time */ |
| {"wet", TokenField.TZ, 0}, /* Western Europe */ |
| {"wetdst", TokenField.DTZ, 4}, /* Western Europe Daylight Savings Time */ |
| {"wft", TokenField.TZ, 48}, /* Wallis and Futuna Time */ |
| {"wgst", TokenField.DTZ, -8}, /* West Greenland Summer Time */ |
| {"wgt", TokenField.TZ, -12}, /* West Greenland Time */ |
| {"wst", TokenField.TZ, 32}, /* West Australian Standard Time */ |
| {"y", TokenField.UNITS, TokenField.DTK_YEAR}, /* "year" for ISO input */ |
| {"yakst", TokenField.DTZ, 40}, /* Yakutsk Summer Time */ |
| {"yakt", TokenField.TZ, 36}, /* Yakutsk Time */ |
| {"yapt", TokenField.TZ, 40}, /* Yap Time (Micronesia) */ |
| {"ydt", TokenField.DTZ, -32}, /* Yukon Daylight Time */ |
| {"yekst", TokenField.DTZ, 24}, /* Yekaterinburg Summer Time */ |
| {"yekt", TokenField.TZ, 20}, /* Yekaterinburg Time */ |
| {YESTERDAY, TokenField.RESERV, TokenField.DTK_YESTERDAY}, /* yesterday midnight */ |
| {"yst", TokenField.TZ, -36}, /* Yukon Standard Time */ |
| {"z", TokenField.TZ, 0}, /* time zone tag per ISO-8601 */ |
| {"zp4", TokenField.TZ, -16}, /* UTC +4 hours. */ |
| {"zp5", TokenField.TZ, -20}, /* UTC +5 hours. */ |
| {"zp6", TokenField.TZ, -24}, /* UTC +6 hours. */ |
| {ZULU, TokenField.TZ, 0}, /* UTC */ |
| }; |
| |
| static Object[][] deltatktbl = { |
| /* text, token, lexval */ |
| {"@", TokenField.IGNORE_DTF, 0}, /* postgres relative prefix */ |
| {DAGO, TokenField.AGO, 0}, /* "ago" indicates negative time offset */ |
| {"c", TokenField.UNITS, TokenField.DTK_CENTURY}, /* "century" relative */ |
| {"cent", TokenField.UNITS, TokenField.DTK_CENTURY}, /* "century" relative */ |
| {"centuries", TokenField.UNITS, TokenField.DTK_CENTURY}, /* "centuries" relative */ |
| {DCENTURY, TokenField.UNITS, TokenField.DTK_CENTURY}, /* "century" relative */ |
| {"d", TokenField.UNITS, TokenField.DTK_DAY}, /* "day" relative */ |
| {DDAY, TokenField.UNITS, TokenField.DTK_DAY}, /* "day" relative */ |
| {"days_full", TokenField.UNITS, TokenField.DTK_DAY}, /* "days_full" relative */ |
| {"dec", TokenField.UNITS, TokenField.DTK_DECADE}, /* "decade" relative */ |
| {DDECADE, TokenField.UNITS, TokenField.DTK_DECADE}, /* "decade" relative */ |
| {"decades", TokenField.UNITS, TokenField.DTK_DECADE}, /* "decades" relative */ |
| {"decs", TokenField.UNITS, TokenField.DTK_DECADE}, /* "decades" relative */ |
| {"h", TokenField.UNITS, TokenField.DTK_HOUR}, /* "hour" relative */ |
| {DHOUR, TokenField.UNITS, TokenField.DTK_HOUR}, /* "hour" relative */ |
| {"hours", TokenField.UNITS, TokenField.DTK_HOUR}, /* "hours" relative */ |
| {"hr", TokenField.UNITS, TokenField.DTK_HOUR}, /* "hour" relative */ |
| {"hrs", TokenField.UNITS, TokenField.DTK_HOUR}, /* "hours" relative */ |
| {INVALID, TokenField.RESERV, TokenField.DTK_INVALID}, /* reserved for invalid time */ |
| {"m", TokenField.UNITS, TokenField.DTK_MINUTE}, /* "minute" relative */ |
| {"microsecon", TokenField.UNITS, TokenField.DTK_MICROSEC}, /* "microsecond" relative */ |
| {"mil", TokenField.UNITS, TokenField.DTK_MILLENNIUM}, /* "millennium" relative */ |
| {"millennia", TokenField.UNITS, TokenField.DTK_MILLENNIUM}, /* "millennia" relative */ |
| {DMILLENNIUM, TokenField.UNITS, TokenField.DTK_MILLENNIUM}, /* "millennium" relative */ |
| {"millisecon", TokenField.UNITS, TokenField.DTK_MILLISEC}, /* relative */ |
| {"mils", TokenField.UNITS, TokenField.DTK_MILLENNIUM}, /* "millennia" relative */ |
| {"min", TokenField.UNITS, TokenField.DTK_MINUTE}, /* "minute" relative */ |
| {"mins", TokenField.UNITS, TokenField.DTK_MINUTE}, /* "minutes" relative */ |
| {DMINUTE, TokenField.UNITS, TokenField.DTK_MINUTE}, /* "minute" relative */ |
| {"minutes", TokenField.UNITS, TokenField.DTK_MINUTE}, /* "minutes" relative */ |
| {"mon", TokenField.UNITS, TokenField.DTK_MONTH}, /* "months_short" relative */ |
| {"mons", TokenField.UNITS, TokenField.DTK_MONTH}, /* "months_short" relative */ |
| {DMONTH, TokenField.UNITS, TokenField.DTK_MONTH}, /* "month" relative */ |
| {"months_short", TokenField.UNITS, TokenField.DTK_MONTH}, |
| {"ms", TokenField.UNITS, TokenField.DTK_MILLISEC}, |
| {"msec", TokenField.UNITS, TokenField.DTK_MILLISEC}, |
| {DMILLISEC, TokenField.UNITS, TokenField.DTK_MILLISEC}, |
| {"mseconds", TokenField.UNITS, TokenField.DTK_MILLISEC}, |
| {"msecs", TokenField.UNITS, TokenField.DTK_MILLISEC}, |
| {"qtr", TokenField.UNITS, TokenField.DTK_QUARTER}, /* "quarter" relative */ |
| {DQUARTER, TokenField.UNITS, TokenField.DTK_QUARTER}, /* "quarter" relative */ |
| {"s", TokenField.UNITS, TokenField.DTK_SECOND}, |
| {"sec", TokenField.UNITS, TokenField.DTK_SECOND}, |
| {DSECOND, TokenField.UNITS, TokenField.DTK_SECOND}, |
| {"seconds", TokenField.UNITS, TokenField.DTK_SECOND}, |
| {"secs", TokenField.UNITS, TokenField.DTK_SECOND}, |
| {DTIMEZONE, TokenField.UNITS, TokenField.DTK_TZ}, /* "timezone" time offset */ |
| {"timezone_h", TokenField.UNITS, TokenField.DTK_TZ_HOUR}, /* timezone hour units */ |
| {"timezone_m", TokenField.UNITS, TokenField.DTK_TZ_MINUTE}, /* timezone minutes units */ |
| {"undefined", TokenField.RESERV, TokenField.DTK_INVALID}, /* pre-v6.1 invalid time */ |
| {"us", TokenField.UNITS, TokenField.DTK_MICROSEC}, /* "microsecond" relative */ |
| {"usec", TokenField.UNITS, TokenField.DTK_MICROSEC}, /* "microsecond" relative */ |
| {DMICROSEC, TokenField.UNITS, TokenField.DTK_MICROSEC}, /* "microsecond" relative */ |
| {"useconds", TokenField.UNITS, TokenField.DTK_MICROSEC}, /* "microseconds" relative */ |
| {"usecs", TokenField.UNITS, TokenField.DTK_MICROSEC}, /* "microseconds" relative */ |
| {"w", TokenField.UNITS, TokenField.DTK_WEEK}, /* "week" relative */ |
| {DWEEK, TokenField.UNITS, TokenField.DTK_WEEK}, /* "week" relative */ |
| {"weeks", TokenField.UNITS, TokenField.DTK_WEEK}, /* "weeks" relative */ |
| {"y", TokenField.UNITS, TokenField.DTK_YEAR}, /* "year" relative */ |
| {DYEAR, TokenField.UNITS, TokenField.DTK_YEAR}, /* "year" relative */ |
| {"years", TokenField.UNITS, TokenField.DTK_YEAR}, /* "years" relative */ |
| {"yr", TokenField.UNITS, TokenField.DTK_YEAR}, /* "year" relative */ |
| {"yrs", TokenField.UNITS, TokenField.DTK_YEAR}, /* "years" relative */ |
| }; |
| |
| public static class DateToken { |
| String key; |
| TokenField type; |
| int value; |
| TokenField valueType; |
| |
| public String getKey() { |
| return key; |
| } |
| |
| public TokenField getType() { |
| return type; |
| } |
| |
| public int getValue() { |
| return value; |
| } |
| |
| public TokenField getValueType() { |
| return valueType; |
| } |
| } |
| public static final Map<String, DateToken> dateTokenMap = new HashMap<>(); |
| |
| static { |
| for (Object[] eachToken: datetktbl) { |
| DateToken dateToken = new DateToken(); |
| dateToken.key = eachToken[0].toString(); |
| dateToken.type = (TokenField)eachToken[1]; |
| if (eachToken[2] instanceof TokenField) { |
| dateToken.valueType = (TokenField)eachToken[2]; |
| dateToken.value = dateToken.valueType.getValue(); |
| } else { |
| dateToken.valueType = TokenField.DECIMAL; |
| dateToken.value = ((Integer)eachToken[2]).intValue(); |
| } |
| dateTokenMap.put(dateToken.key, dateToken); |
| } |
| |
| /* |
| * TODO |
| * Currently, tajo does not support intervals, yet. |
| * The below code must be restored to support intervals. |
| */ |
| // for (Object[] eachToken: deltatktbl) { |
| // DateToken dateToken = new DateToken(); |
| // dateToken.key = eachToken[0].toString(); |
| // dateToken.type = (TokenField)eachToken[1]; |
| // if (eachToken[2] instanceof TokenField) { |
| // dateToken.valueType = (TokenField)eachToken[2]; |
| // dateToken.value = dateToken.valueType.getValue(); |
| // } else { |
| // dateToken.valueType = TokenField.DECIMAL; |
| // dateToken.value = ((Integer)eachToken[2]).intValue(); |
| // } |
| // dateTokenMap.put(dateToken.key, dateToken); |
| // } |
| } |
| |
| public static int INTERVAL_MASK(TokenField t) { return (1 << (t.getValue())); } |
| public static int DTK_M(TokenField t) { return (0x01 << (t.getValue())); } |
| |
| public static final int DTK_ALL_SECS_M = (DTK_M(TokenField.SECOND) | |
| DTK_M(TokenField.MILLISECOND) | |
| DTK_M(TokenField.MICROSECOND)); |
| public static final int DTK_DATE_M = (DTK_M(TokenField.YEAR) | DTK_M(TokenField.MONTH) | DTK_M(TokenField.DAY)); |
| public static final int DTK_TIME_M = (DTK_M(TokenField.HOUR) | DTK_M(TokenField.MINUTE) | DTK_M(TokenField.SECOND)); |
| } |