package org.springside.modules.utils.time; import java.util.concurrent.atomic.AtomicReference; import org.apache.commons.lang3.time.FastDateFormat; /** * DateFormat.format()消耗较大,如果时间戳是递增的,而且同一单位内有多次format(),使用用本类减少重复调用. * * From Log4j2 DatePatternConverter,进行了优化,根据输出格式是否毫秒级,决定缓存在秒级还是毫秒级. * * @author calvin */ public class CachingDateFormatter { private FastDateFormat fastDateFormat; private AtomicReference<CachedTime> cachedTime; private boolean onSecond;// 根据时间格式,决定缓存在 public CachingDateFormatter(String pattern) { this(FastDateFormat.getInstance(pattern)); } public CachingDateFormatter(FastDateFormat fastDateFormat) { this.fastDateFormat = fastDateFormat; onSecond = fastDateFormat.getPattern().indexOf("SSS") == -1; long current = System.currentTimeMillis(); this.cachedTime = new AtomicReference<CachedTime>(new CachedTime(current, fastDateFormat.format(current))); } public String format(final long timestampMillis) { CachedTime cached = cachedTime.get(); long timestamp = onSecond ? timestampMillis / 1000 : timestampMillis; if (timestamp != cached.timestamp) { final CachedTime newCachedTime = new CachedTime(timestamp, fastDateFormat.format(timestampMillis)); if (cachedTime.compareAndSet(cached, newCachedTime)) { cached = newCachedTime; } else { cached = cachedTime.get(); } } return cached.formatted; } static final class CachedTime { public long timestamp; public String formatted; public CachedTime(final long timestamp, String formatted) { this.timestamp = timestamp; this.formatted = formatted; } } }