/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
{
System.
out.
println(parseRFC3339Date
("2007-05-01T15:43:26-07:00")); System.
out.
println(parseRFC3339Date
("2007-05-01T15:43:26.3-07:00")); System.
out.
println(parseRFC3339Date
("2007-05-01T15:43:26.3452-07:00")); System.
out.
println(parseRFC3339Date
("2007-05-01T15:43:26+07:00")); System.
out.
println(parseRFC3339Date
("2007-05-01T15:43:26.3+07:00")); System.
out.
println(parseRFC3339Date
("2007-05-01T15:43:26.3452+07:00")); System.
out.
println(parseRFC3339Date
("2007-05-01T15:43:26.3452Z")); System.
out.
println(parseRFC3339Date
("2007-05-01T15:43:26.3Z")); System.
out.
println(parseRFC3339Date
("2007-05-01T15:43:26Z")); }
//if there is no time zone, we don't need to do any special parsing.
if (dateString.endsWith("Z")) {
try {
s.
setTimeZone(TimeZone.
getTimeZone("UTC")); d = s.parse(dateString);
} catch (java.
text.
ParseException pe
) {//try again with optional decimals s.
setTimeZone(TimeZone.
getTimeZone("UTC")); s.setLenient(true);
d = s.parse(dateString);
}
return d;
}
//step one, split off the timezone.
if (dateString.lastIndexOf('+') == -1) {
firstPart = dateString.substring(0, dateString.lastIndexOf('-'));
secondPart = dateString.substring(dateString.lastIndexOf('-'));
} else {
firstPart = dateString.substring(0, dateString.lastIndexOf('+'));
secondPart = dateString.substring(dateString.lastIndexOf('+'));
}
//step two, remove the colon from the timezone offset
secondPart = secondPart.substring(0, secondPart.indexOf(':')) + secondPart.substring(secondPart.indexOf(':') + 1);
dateString = firstPart + secondPart;
try {
d = s.parse(dateString);
} catch (java.
text.
ParseException pe
) {//try again with optional decimals s
= new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSSSZ",
Locale.
getDefault());//spec for RFC3339 (with fractional seconds) s.setLenient(true);
d = s.parse(dateString);
}
return d;
}
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CmltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKaW1wb3J0IGphdmEudXRpbC5EYXRlOwppbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKaW1wb3J0IGphdmEudXRpbC5UaW1lWm9uZTsKCi8qIE5hbWUgb2YgdGhlIGNsYXNzIGhhcyB0byBiZSAiTWFpbiIgb25seSBpZiB0aGUgY2xhc3MgaXMgcHVibGljLiAqLwpjbGFzcyBJZGVvbmUKewoJcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uCgl7CgkgICAgU3lzdGVtLm91dC5wcmludGxuKHBhcnNlUkZDMzMzOURhdGUoIjIwMDctMDUtMDFUMTU6NDM6MjYtMDc6MDAiKSk7CgkgCVN5c3RlbS5vdXQucHJpbnRsbihwYXJzZVJGQzMzMzlEYXRlKCIyMDA3LTA1LTAxVDE1OjQzOjI2LjMtMDc6MDAiKSk7CQogICAgCVN5c3RlbS5vdXQucHJpbnRsbihwYXJzZVJGQzMzMzlEYXRlKCIyMDA3LTA1LTAxVDE1OjQzOjI2LjM0NTItMDc6MDAiKSk7CQoJICAgIFN5c3RlbS5vdXQucHJpbnRsbihwYXJzZVJGQzMzMzlEYXRlKCIyMDA3LTA1LTAxVDE1OjQzOjI2KzA3OjAwIikpOwoJIAlTeXN0ZW0ub3V0LnByaW50bG4ocGFyc2VSRkMzMzM5RGF0ZSgiMjAwNy0wNS0wMVQxNTo0MzoyNi4zKzA3OjAwIikpOwkKICAgIAlTeXN0ZW0ub3V0LnByaW50bG4ocGFyc2VSRkMzMzM5RGF0ZSgiMjAwNy0wNS0wMVQxNTo0MzoyNi4zNDUyKzA3OjAwIikpOwkKICAgIAlTeXN0ZW0ub3V0LnByaW50bG4ocGFyc2VSRkMzMzM5RGF0ZSgiMjAwNy0wNS0wMVQxNTo0MzoyNi4zNDUyWiIpKTsJCiAgICAJU3lzdGVtLm91dC5wcmludGxuKHBhcnNlUkZDMzMzOURhdGUoIjIwMDctMDUtMDFUMTU6NDM6MjYuM1oiKSk7CiAgICAJU3lzdGVtLm91dC5wcmludGxuKHBhcnNlUkZDMzMzOURhdGUoIjIwMDctMDUtMDFUMTU6NDM6MjZaIikpOwkKCX0KCQoJcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgRGF0ZSBwYXJzZVJGQzMzMzlEYXRlKFN0cmluZyBkYXRlU3RyaW5nKSB0aHJvd3MgamF2YS50ZXh0LlBhcnNlRXhjZXB0aW9uLCBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHsKICAgICAgICBEYXRlIGQ7CgogICAgICAgIC8vaWYgdGhlcmUgaXMgbm8gdGltZSB6b25lLCB3ZSBkb24ndCBuZWVkIHRvIGRvIGFueSBzcGVjaWFsIHBhcnNpbmcuCiAgICAgICAgaWYgKGRhdGVTdHJpbmcuZW5kc1dpdGgoIloiKSkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgU2ltcGxlRGF0ZUZvcm1hdCBzID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoInl5eXktTU0tZGQnVCdISDptbTpzcydaJyIsIExvY2FsZS5nZXREZWZhdWx0KCkpOy8vc3BlYyBmb3IgUkZDMzMzOSB3aXRoIGEgJ1onCiAgICAgICAgICAgICAgICBzLnNldFRpbWVab25lKFRpbWVab25lLmdldFRpbWVab25lKCJVVEMiKSk7CiAgICAgICAgICAgICAgICBkID0gcy5wYXJzZShkYXRlU3RyaW5nKTsKICAgICAgICAgICAgfSBjYXRjaCAoamF2YS50ZXh0LlBhcnNlRXhjZXB0aW9uIHBlKSB7Ly90cnkgYWdhaW4gd2l0aCBvcHRpb25hbCBkZWNpbWFscwogICAgICAgICAgICAgICAgU2ltcGxlRGF0ZUZvcm1hdCBzID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoInl5eXktTU0tZGQnVCdISDptbTpzcy5TU1NTU1MnWiciLCBMb2NhbGUuZ2V0RGVmYXVsdCgpKTsvL3NwZWMgZm9yIFJGQzMzMzkgd2l0aCBhICdaJyBhbmQgZnJhY3Rpb25hbCBzZWNvbmRzCiAgICAgICAgICAgICAgICBzLnNldFRpbWVab25lKFRpbWVab25lLmdldFRpbWVab25lKCJVVEMiKSk7CiAgICAgICAgICAgICAgICBzLnNldExlbmllbnQodHJ1ZSk7CiAgICAgICAgICAgICAgICBkID0gcy5wYXJzZShkYXRlU3RyaW5nKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZDsKICAgICAgICB9CgogICAgICAgIC8vc3RlcCBvbmUsIHNwbGl0IG9mZiB0aGUgdGltZXpvbmUuCiAgICAgICAgU3RyaW5nIGZpcnN0UGFydDsKICAgICAgICBTdHJpbmcgc2Vjb25kUGFydDsKICAgICAgICBpZiAoZGF0ZVN0cmluZy5sYXN0SW5kZXhPZignKycpID09IC0xKSB7CiAgICAgICAgICAgIGZpcnN0UGFydCA9IGRhdGVTdHJpbmcuc3Vic3RyaW5nKDAsIGRhdGVTdHJpbmcubGFzdEluZGV4T2YoJy0nKSk7CiAgICAgICAgICAgIHNlY29uZFBhcnQgPSBkYXRlU3RyaW5nLnN1YnN0cmluZyhkYXRlU3RyaW5nLmxhc3RJbmRleE9mKCctJykpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGZpcnN0UGFydCA9IGRhdGVTdHJpbmcuc3Vic3RyaW5nKDAsIGRhdGVTdHJpbmcubGFzdEluZGV4T2YoJysnKSk7CiAgICAgICAgICAgIHNlY29uZFBhcnQgPSBkYXRlU3RyaW5nLnN1YnN0cmluZyhkYXRlU3RyaW5nLmxhc3RJbmRleE9mKCcrJykpOwogICAgICAgIH0KCiAgICAgICAgLy9zdGVwIHR3bywgcmVtb3ZlIHRoZSBjb2xvbiBmcm9tIHRoZSB0aW1lem9uZSBvZmZzZXQKICAgICAgICBzZWNvbmRQYXJ0ID0gc2Vjb25kUGFydC5zdWJzdHJpbmcoMCwgc2Vjb25kUGFydC5pbmRleE9mKCc6JykpICsgc2Vjb25kUGFydC5zdWJzdHJpbmcoc2Vjb25kUGFydC5pbmRleE9mKCc6JykgKyAxKTsKICAgICAgICBkYXRlU3RyaW5nID0gZmlyc3RQYXJ0ICsgc2Vjb25kUGFydDsKICAgICAgICBTaW1wbGVEYXRlRm9ybWF0IHMgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgieXl5eS1NTS1kZCdUJ0hIOm1tOnNzWiIsIExvY2FsZS5nZXREZWZhdWx0KCkpOy8vc3BlYyBmb3IgUkZDMzMzOQogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGQgPSBzLnBhcnNlKGRhdGVTdHJpbmcpOwogICAgICAgIH0gY2F0Y2ggKGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbiBwZSkgey8vdHJ5IGFnYWluIHdpdGggb3B0aW9uYWwgZGVjaW1hbHMKICAgICAgICAgICAgcyA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJ5eXl5LU1NLWRkJ1QnSEg6bW06c3MuU1NTU1NTWiIsIExvY2FsZS5nZXREZWZhdWx0KCkpOy8vc3BlYyBmb3IgUkZDMzMzOSAod2l0aCBmcmFjdGlvbmFsIHNlY29uZHMpCiAgICAgICAgICAgIHMuc2V0TGVuaWVudCh0cnVlKTsKICAgICAgICAgICAgZCA9IHMucGFyc2UoZGF0ZVN0cmluZyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBkOwogICAgfQp9