/* (c) 2014 Open Source Geospatial Foundation - all rights reserved
* (c) 2001 - 2013 OpenPlans
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.importer;
import java.text.ParseException;
import java.util.Arrays;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.TimeZone;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import com.google.common.base.Predicate;
import com.google.common.collect.Collections2;
/**
* Utility class for parsing/encoding dates.
*
* @author Justin Deoliveira, OpenGeo
*/
public class Dates {
static List<DatePattern> PATTERNS = Arrays.asList(
dp("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'",
"\\d{4}-\\d{1,2}-\\d{1,2}T\\d{1,2}:\\d{1,2}:\\d{1,2}\\.\\d{1,3}Z"),
dp("yyyy-MM-dd'T'HH:mm:sss'Z'", "\\d{4}-\\d{1,2}-\\d{1,2}T\\d{1,2}:\\d{1,2}:\\d{1,3}Z"),
dp("yyyy-MM-dd'T'HH:mm:ss'Z'", "\\d{4}-\\d{1,2}-\\d{1,2}T\\d{1,2}:\\d{1,2}:\\d{1,2}Z"),
dp("yyyy-MM-dd'T'HH:mm'Z'", "\\d{4}-\\d{1,2}-\\d{1,2}T\\d{1,2}:\\d{1,2}Z"),
dp("yyyy-MM-dd'T'HH'Z'", "\\d{4}-\\d{1,2}-\\d{1,2}T\\d{1,2}Z"),
dp("yyyy-MM-dd", "\\d{4}-\\d{1,2}-\\d{1,2}"),
dp("yyyy-MM", "\\d{4}-\\d{1,2}"),
dp("yyyyMMdd", "\\d{6,8}", true, true),
dp("yyyyMM", "\\d{5,6}", true, true),
dp("yyyy", "\\d{4}")
);
/**
* Returns list of all patterns, optionally filtering out ones that require a strict
* match.
*
* @param strict when <tt>false</tt> those patterns that require a strict match (ie. a
* pattern match and a date parse) are filtered out.
*/
public static Collection<DatePattern> patterns(boolean strict) {
Collection<DatePattern> patterns = PATTERNS;
if (!strict) {
patterns = Collections2.filter(patterns, new Predicate<DatePattern>() {
@Override
public boolean apply(DatePattern input) {
return !input.isStrict();
}
});
}
return patterns;
}
public static final TimeZone UTC_TZ = TimeZone.getTimeZone("UTC");
static DatePattern dp(String format, String regex) {
return new DatePattern(format, regex);
}
static DatePattern dp(String format, String regex, boolean forceGmt, boolean strict) {
return new DatePattern(format, regex, forceGmt, strict);
}
public static Date matchAndParse(String str) {
return parse(str, true);
}
public static Date parse(String str) {
return parse(str, false);
}
static Date parse(String str, boolean match) {
Collection<DatePattern> patterns = patterns(match);
for (DatePattern dp : patterns) {
Date parsed = match ? dp.matchAndParse(str) : dp.parse(str);
if (parsed != null) {
return parsed;
}
}
return null;
}
static Date parseDate(DatePattern dp, String str) {
Pattern p = dp.pattern();
Matcher m = p.matcher(str);
if (m.matches()) {
String match = m.group(1);
try {
Date parsed = dp.dateFormat().parse(match);
if (parsed != null) {
return parsed;
}
} catch (ParseException e) {
//ignore
}
}
return null;
}
}