/* * Copyright (c) 2006 Henri Sivonen * Copyright (c) 2012 Mozilla Foundation * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ package org.whattf.datatype; import java.util.regex.Pattern; public class TimeDatetime extends AbstractDatetime { /** * The singleton instance. */ public static final TimeDatetime THE_INSTANCE = new TimeDatetime(); public int i; /** * The rexexp for this datatype. * * See also AbstractDatetime#checkValid, which references the capturing * groups in this regexp. * * Capturing groups: * * valid month string * 1 = year * 2 = month * * valid date string * 3 = year * 4 = month * 5 = day * * valid yearless date string * 6 = month * 7 = day * * valid time string * 8 = hours * 9 = minutes * 10 = seconds * 11 = milliseconds * * valid local date and time string * 12 = year * 13 = month * 14 = day * 15 = hours * 16 = minutes * 17 = seconds * 18 = milliseconds * * valid time-zone offset string * 19 = timezone hours * 20 = timezone minutes * * valid global date and time string * 21 = year * 22 = month * 23 = day * 24 = hours * 25 = minutes * 26 = seconds * 27 = milliseconds * 28 = timezone hours * 29 = timezone minutes * * valid week string * 30 = year * 31 = week * * valid year (valid non-negative integer) * 32 = year * * valid duration string * 33 = milliseconds * 34 = milliseconds * */ private static final Pattern THE_PATTERN = Pattern.compile("^[ \\t\\r\\n\\f]*(?:(?:([0-9]{4,})-([0-9]{2}))|(?:([0-9]{4,})-([0-9]{2})-([0-9]{2}))|(?:([0-9]{2})-([0-9]{2}))|(?:([0-9]{2}):([0-9]{2})(?::([0-9]{2})(?:\\.([0-9]+))?)?)|(?:([0-9]{4,})-([0-9]{2})-([0-9]{2})(?:T| )([0-9]{2}):([0-9]{2})(?::([0-9]{2})(?:\\.([0-9]+))?)?)|(?:Z|(?:[+-]([0-9]{2}):?([0-9]{2})))|(?:([0-9]{4,})-([0-9]{2})-([0-9]{2})(?:T| )([0-9]{2}):([0-9]{2})(?::([0-9]{2})(?:\\.([0-9]+))?)?(?:Z|(?:[+-]([0-9]{2}):?([0-9]{2}))))|(?:([0-9]{4,})-W([0-9]{2}))|(?:([0-9]{4,}))|(?:P(?:(?:[0-9]+D)|(?:(?:[0-9]+D)?T[0-9]+H)|(?:(?:[0-9]+D)?T(?:[0-9]+H)?[0-9]+M)|(?:(?:[0-9]+D)?T(?:(?:[0-9]+)H)?(?:(?:[0-9]+)M)?(?:[0-9]+(?:\\.([0-9]+))?S))))|(?:[ \\t\\r\\n\\f]*[0-9]+(?:(?:[ \\t\\r\\n\\f]*(?:[Ww]|[Dd]|[Hh]|[Mm]))|(?:(?:\\.([0-9]+))?[ \\t\\r\\n\\f]*[Ss])))+)[ \\t\\r\\n\\f]*$"); private TimeDatetime() { super(); } @Override protected Pattern getPattern() { return THE_PATTERN; } @Override public String getName() { return "time-datetime"; } }