måndag 9 februari 2015

Universal Date Util in Java

       

package se.nap;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.TimeZone;

public class UniversalDateUtil
{
 private static final Map REGEX = null;
 public static final String DEFAULT_FORMAT = "yyyy-MM-dd'T'HH:mm:ssZZZ";
 private static final UniversalDateUtil instance = new UniversalDateUtil();

 private UniversalDateUtil()
 {
  // Test Regex here; http://www.regexplanet.com/advanced/java/index.html before inserting new format
  REGEX = new HashMap();
  REGEX.put("^\\d{8}$", "yyyyMMdd");
  REGEX.put("^\\d{1,2}-\\d{1,2}-\\d{4}$", "dd-MM-yyyy");
  REGEX.put("^\\d{4}-\\d{1,2}-\\d{1,2}$", "yyyy-MM-dd");
  REGEX.put("^\\d{1,2}/\\d{1,2}/\\d{4}$", "MM/dd/yyyy");
  REGEX.put("^\\d{4}/\\d{1,2}/\\d{1,2}$", "yyyy/MM/dd");
  REGEX.put("^\\d{1,2}\\s[a-zA-Z]{3}\\s\\d{4}$", "dd MMM yyyy");
  REGEX.put("^\\d{1,2}\\s[a-zA-Z]{4,}\\s\\d{4}$", "dd MMMM yyyy");
  REGEX.put("^\\d{12}$", "yyyyMMddHHmm");
  REGEX.put("^\\d{8}\\s\\d{4}$", "yyyyMMdd HHmm");
  REGEX.put("^\\d{1,2}-\\d{1,2}-\\d{4}\\s\\d{1,2}:\\d{2}$", "dd-MM-yyyy HH:mm");
  REGEX.put("^\\d{4}-\\d{1,2}-\\d{1,2}\\s\\d{1,2}:\\d{2}$", "yyyy-MM-dd HH:mm");
  REGEX.put("^\\d{4}-\\d{1,2}-\\d{1,2}T\\d{1,2}:\\d{2}:\\d{2}Z$", "yyyy-MM-dd'T'HH:mm:ss'Z'");
  REGEX.put("^\\d{4}-\\d{1,2}-\\d{1,2}'T'\\d{1,2}:\\d{2}:\\d{2}Z$", "yyyy-MM-dd'T'HH:mm:ss'Z'");
  REGEX.put("^\\d{4}-\\d{1,2}-\\d{1,2}T\\d{1,2}:\\d{2}:\\d{2}z$", "yyyy-MM-dd'T'HH:mm:ss'z'");
  REGEX.put("^\\d{4}-\\d{1,2}-\\d{1,2}T\\d{1,2}:\\d{2}:\\d{2}z$", "yyyy-MM-dd'T'HH:mm:ss'z'");
  REGEX.put("^\\d{4}-\\d{1,2}-\\d{1,2}T\\d{1,2}:\\d{2}:\\d{2}[A-Z]{0,3}$", "yyyy-MM-dd'T'HH:mm:ssz"); 
  REGEX.put("^\\d{4}-\\d{1,2}-\\d{1,2}T\\d{1,2}:\\d{2}:\\d{2}[-|+]\\d{4}$","yyyy-MM-dd'T'HH:mm:ssZZZ");
  REGEX.put("^\\d{1,2}/\\d{1,2}/\\d{4}\\s\\d{1,2}:\\d{2}$", "MM/dd/yyyy HH:mm");
  REGEX.put("^\\d{4}/\\d{1,2}/\\d{1,2}\\s\\d{1,2}:\\d{2}$", "yyyy/MM/dd HH:mm");
  REGEX.put("^\\d{1,2}\\s[a-zA-Z]{3}\\s\\d{4}\\s\\d{1,2}:\\d{2}$", "dd MMM yyyy HH:mm");
  REGEX.put("^\\d{1,2}\\s[a-zA-Z]{4,}\\s\\d{4}\\s\\d{1,2}:\\d{2}$", "dd MMMM yyyy HH:mm");
  REGEX.put("^\\d{14}$", "yyyyMMddHHmmss");
  REGEX.put("^\\d{8}\\s\\d{6}$", "yyyyMMdd HHmmss");
  REGEX.put("^\\d{1,2}-\\d{1,2}-\\d{4}\\s\\d{1,2}:\\d{2}:\\d{2}$", "dd-MM-yyyy HH:mm:ss");
  REGEX.put("^\\d{4}-\\d{1,2}-\\d{1,2}\\s\\d{1,2}:\\d{2}:\\d{2}$", "yyyy-MM-dd HH:mm:ss");
  REGEX.put("^\\d{1,2}/\\d{1,2}/\\d{4}\\s\\d{1,2}:\\d{2}:\\d{2}$", "MM/dd/yyyy HH:mm:ss");
  REGEX.put("^\\d{4}/\\d{1,2}/\\d{1,2}\\s\\d{1,2}:\\d{2}:\\d{2}$", "yyyy/MM/dd HH:mm:ss");
  REGEX.put("^\\d{1,2}\\s[a-zA-Z]{3}\\s\\d{4}\\s\\d{1,2}:\\d{2}:\\d{2}$", "dd MMM yyyy HH:mm:ss");
  REGEX.put("^\\d{1,2}\\s[a-zA-Z]{4,}\\s\\d{4}\\s\\d{1,2}:\\d{2}:\\d{2}$", "dd MMMM yyyy HH:mm:ss");

 }

 public static String determineDateFormat(String dateString)
 {
  for (String regexp : REGEX.keySet())
  {
   if (dateString.matches(regexp))
   {
    return REGEX.get(regexp);
   }
  }
  
  return null; // Unknown format.
 }

 public static Collection getFormats()
 {
  return REGEX.values();
 }
 public static Date parseString(String dateTime) throws ParseException
 {
  return parseString(dateTime, null);
 }
 public static Date parseString(String dateTime, Locale locale) throws ParseException
 {
  String format = determineDateFormat(dateTime);
  if (format != null)
  {
   return getFormatter(format,locale).parse(dateTime);
  }
  return null;
 }
 public static String toString(final Date date)
 {
  return toString(date, DEFAULT_FORMAT, null, null);
 }
 public static String toString(final Date date, Locale locale)
 {
  return toString(date, DEFAULT_FORMAT, locale, null);
 }
 
 public static String toString(final Date date, final String format, Locale locale, final String timezone)
 {
  
  DateFormat formatter =  getFormatter(format, locale);
  if(timezone!=null)
  {
   final TimeZone tz = TimeZone.getTimeZone(timezone);
   formatter.setTimeZone(tz);
  }
 
  return formatter.format(date);

 }

 private static DateFormat getFormatter(String format, Locale locale)
 {
  if(locale==null)
  {
   locale = Locale.getDefault();
  }
  return instance.new ConcurrentDateFormatAccess(format, locale).dateformat.get();
 }

  
 class ConcurrentDateFormatAccess
 {
  private ThreadLocal dateformat;
  
  public ConcurrentDateFormatAccess(final String pattern, final Locale locale)
  {
   dateformat = new ThreadLocal()
   {
    @Override
    public DateFormat get()
    {
     return super.get();
    }

    @Override
    protected DateFormat initialValue()
    {
     return new SimpleDateFormat(pattern, locale);
    }

    @Override
    public void remove()
    {
     super.remove();
    }

    @Override
    public void set(DateFormat value)
    {
     super.set(value);
    }
   };
  }
 }
}

       
 

Inga kommentarer:

Skicka en kommentar