package net.i2p.router.util; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; import java.util.TimeZone; /** * Moved from NewsFetcher * @since 0.8.5 */ public abstract class RFC822Date { // SimpleDateFormat is not thread-safe, methods must be synchronized private static final SimpleDateFormat OUTPUT_FORMAT = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss z", Locale.US); /** * http://jimyjoshi.com/blog/2007/08/rfc822dateparsinginjava.html * Apparently public domain * Probably don't need all of these... */ private static final SimpleDateFormat rfc822DateFormats[] = new SimpleDateFormat[] { OUTPUT_FORMAT, new SimpleDateFormat("d MMM yy HH:mm:ss z", Locale.US), new SimpleDateFormat("EEE, d MMM yy HH:mm z", Locale.US), new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss z", Locale.US), new SimpleDateFormat("EEE, d MMM yyyy HH:mm z", Locale.US), new SimpleDateFormat("d MMM yy HH:mm z", Locale.US), new SimpleDateFormat("d MMM yy HH:mm:ss z", Locale.US), new SimpleDateFormat("d MMM yyyy HH:mm z", Locale.US) }; // // The router JVM is forced to UTC but do this just in case // static { TimeZone utc = TimeZone.getTimeZone("GMT"); for (int i = 0; i < rfc822DateFormats.length; i++) { rfc822DateFormats[i].setTimeZone(utc); } } /** * new Date(String foo) is deprecated, so let's do this the hard way * * @param s non-null * @return -1 on failure */ public synchronized static long parse822Date(String s) { for (int i = 0; i < rfc822DateFormats.length; i++) { try { Date date = rfc822DateFormats[i].parse(s); if (date != null) return date.getTime(); } catch (ParseException pe) {} } return -1; } /** * Format is "d MMM yyyy HH:mm:ss z" * * @since 0.8.2 */ public synchronized static String to822Date(long t) { return OUTPUT_FORMAT.format(new Date(t)); } /**** public static void main(String[] args) { if (args.length == 1) { try { System.out.println(to822Date(Long.parseLong(args[0]))); } catch (NumberFormatException nfe) { System.out.println(nfe.toString()); } } else { System.out.println("Usage: RFC822Date numericDate"); } } ****/ }