package com.alexvasilkov.android.commons.dates;
import java.text.ParseException;
import java.util.Date;
public class ISO8601DateFormatter {
private static final ThreadSafeDateFormatter ISO8601_PARSER =
new ThreadSafeDateFormatter("yyyy-MM-dd'T'HH:mm:ssZ");
private static final ThreadSafeDateFormatter ISO8601_FORMATTER =
new ThreadSafeDateFormatter("yyyy-MM-dd'T'HH:mm:ss", ThreadSafeDateFormatter.GMT);
/**
* Produces string in format <code>yyyy-MM-ddTHH:mm:ss+00:00</code>
*/
public static String formatISO8601(Date date) {
return ISO8601_FORMATTER.format(date) + "+00:00";
}
/**
* Parses dates in following formats:
* <pre>
* yyyy-MM-dd
* yyyy-MM-ddTHH:mm:ss[.S+]
* yyyy-MM-ddTHH:mm:ss[.S+]Z
* yyyy-MM-ddTHH:mm:ss[.S+]±hh[[:]mm]
* </pre>
*/
public static Date parseISO8601(String str) throws ParseException {
if (str == null) throw new NullPointerException("String to parse is null");
if (str.charAt(str.length() - 1) == 'Z') str = str.substring(0, str.length() - 1) + "+0000";
// Stripping milliseconds
int dotIndex = str.indexOf('.');
if (dotIndex == -1) dotIndex = str.indexOf(',');
if (dotIndex != -1) {
int endIndex = str.indexOf('+', dotIndex);
if (endIndex == -1) endIndex = str.indexOf('-', dotIndex);
if (endIndex == -1) endIndex = str.length();
str = str.substring(0, dotIndex) + str.substring(endIndex);
}
// Adding missing parts
if (str.length() == "yyyy-MM-dd".length()) { // No time
str += "T00:00:00+0000";
} else if (str.length() == "yyyy-MM-ddTHH:mm:ss".length()) { // No timezone
str += "+0000";
} else if (str.length() == "yyyy-MM-ddTHH:mm:ss±hh".length()) { // No minutes in timezone
str += "00";
}
if (str.charAt(str.length() - 3) == ':')
str = str.substring(0, str.length() - 3) + str.substring(str.length() - 2);
// At this point we should have string in format yyyy-MM-ddTHH:mm:ss±hhmm
return ISO8601_PARSER.parse(str);
}
// public static void testParser() {
// String[] tests = {
// "1988-03-06",
// "1988-03-06T12:33:14",
// "1988-03-06T12:33:14.12345",
// "1988-03-06T12:33:14Z",
// "1988-03-06T12:33:14,123Z",
// "1988-03-06T12:33:14+03",
// "1988-03-06T12:33:14.123+03",
// "1988-03-06T12:33:14-04:30",
// "1988-03-06T12:33:14-0430",
// "1988-03-06T12:33:14,1-04:30"
// };
//
// for (String str : tests) {
// test(str);
// }
// }
//
// private static void test(String str) {
// try {
// Date parsed = parseISO8601(str);
// String back = formatISO8601(parsed);
// Log.d("DATETEST", str + " -> " + back + " // " + parsed.toString());
// } catch (Exception e) {
// Log.e("DATETEST", "Can't parse date: " + str + " // " + e.getMessage());
// }
// }
}