package com.alexvasilkov.android.commons.dates; import java.text.DateFormatSymbols; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; import java.util.TimeZone; /** * Thread safe date formatter. Each thread will have it's own instance of {@link SimpleDateFormat} formatter.<br/> * This class provides basic methods to parse / format dates: {@link #parse(String)}, {@link #format(java.util.Date)}, * {@link #format(long)}. */ public class ThreadSafeDateFormatter { public static final TimeZone GMT = TimeZone.getTimeZone("GMT"); private final String mPattern; private final Locale mLocale; private final TimeZone mTz; private final DateFormatSymbols mSymbols; private ThreadLocal<SimpleDateFormat> mFormatter = new ThreadLocal<SimpleDateFormat>() { protected SimpleDateFormat initialValue() { Locale locale = mLocale == null ? Locale.getDefault() : mLocale; SimpleDateFormat formatter = new SimpleDateFormat(mPattern, locale); if (mTz != null) formatter.setTimeZone(mTz); if (mSymbols != null) formatter.setDateFormatSymbols(mSymbols); return formatter; } }; public ThreadSafeDateFormatter(String pattern) { this(pattern, null, null, null); } public ThreadSafeDateFormatter(String pattern, Locale locale) { this(pattern, locale, null, null); } public ThreadSafeDateFormatter(String pattern, TimeZone tz) { this(pattern, null, tz, null); } public ThreadSafeDateFormatter(String pattern, DateFormatSymbols symbols) { this(pattern, null, null, symbols); } public ThreadSafeDateFormatter(String pattern, Locale locale, TimeZone tz) { this(pattern, locale, tz, null); } public ThreadSafeDateFormatter(String pattern, Locale locale, TimeZone tz, DateFormatSymbols symbols) { mPattern = pattern; mLocale = locale; mTz = tz; mSymbols = symbols; } public Date parse(String str) throws ParseException { return mFormatter.get().parse(str); } public String format(Date date) { return mFormatter.get().format(date); } public String format(long date) { return format(new Date(date)); } }