String formatters in JDK are not thread-safe
using ThreadLocal here so each thread may have one copy of DATE_FORMATTER