package com.ebizwindow.crm.utils; import java.text.FieldPosition; import java.text.ParsePosition; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * 时间日期格式化类 * * @author yeyong * */ public class PrettyDateFormat extends SimpleDateFormat { private static final long serialVersionUID = 1L; private Pattern pattern = Pattern.compile("(‘*)(#{1,2}|@)"); private FormatType formatType = FormatType.DEAFULT; private SimpleDateFormat simpleDateFormat; private enum FormatType { DEAFULT, TIME, DAY }; /** * 构造器 * <p> * format中的@表示[XXX秒前,XXX分钟前,XXX小时前(最多是23小时前)] * <p> * format中的#表示[空字串(表示今天),昨天,前天] * <p> * format中的##表示[今天,昨天,前天] * * @param format * 和SimpleDateFormat中的格式设置基本上是一样的,只是多的@格式 #格式和##格式 * @param fullFormat * 和SimpleDateFormat中的格式设置是一样的 */ public PrettyDateFormat(String format, String fullFormat) { super(fullFormat); Matcher m = pattern.matcher(format); while (m.find()) { if (m.group(1).length() % 2 == 0) { if ("@".equals(m.group(2))) { if (formatType == FormatType.DAY) { throw new IllegalArgumentException("#和@模式字符不能同时使用."); } formatType = FormatType.TIME; } else { if (formatType == FormatType.TIME) { throw new IllegalArgumentException("#和@模式字符不能同时使用."); } formatType = FormatType.DAY; } } } this.simpleDateFormat = new SimpleDateFormat(format.replace("‘", "‘‘")); } @Override public Object parseObject(String source, ParsePosition pos) { throw new UnsupportedOperationException("暂时还不支持的操作"); } /* * (non-Javadoc) * * @see java.text.SimpleDateFormat#format(java.util.Date, * java.lang.StringBuffer, java.text.FieldPosition) */ public StringBuffer format(Date date, StringBuffer toAppendTo, FieldPosition pos) { if (formatType == FormatType.DEAFULT) { return super.format(date, toAppendTo, pos); } long curTime = System.currentTimeMillis(); long diffDay = 0L; long diffSecond = 0L; if (formatType == FormatType.TIME) { diffSecond = (curTime - date.getTime()) / 1000L; if (diffSecond < 0 || diffSecond >= 86400) { return super.format(date, toAppendTo, pos); } } if (formatType == FormatType.DAY) { Calendar curDate = new GregorianCalendar(); curDate.setTime(new Date(curTime)); curDate.set(Calendar.HOUR_OF_DAY, 23); curDate.set(Calendar.MINUTE, 59); curDate.set(Calendar.SECOND, 59); curDate.set(Calendar.MILLISECOND, 999); diffDay = (curDate.getTimeInMillis() - date.getTime()) / 86400000L; if (diffDay < 0 || diffDay > 2) { return super.format(date, toAppendTo, pos); } } StringBuffer sb = new StringBuffer(); Matcher m = pattern.matcher(simpleDateFormat.format(date)); if (m.find()) { String group2 = m.group(2); String replacement = ""; while (true) { if ("@".equals(group2)) { if (diffSecond < 60) { replacement = diffSecond == 0 ? "1秒前" : diffSecond + "秒前"; } else if (diffSecond < 3600) { replacement = diffSecond / 60 + "分钟前"; } else if (diffSecond < 86400) { replacement = diffSecond / 3600 + "小时前"; } } else { if (diffDay == 0) { replacement = group2.length() == 2 ? "今天" : ""; } else if (diffDay == 1) { replacement = "昨天"; } else { replacement = "前天"; } } m.appendReplacement(sb, replacement); if (!m.find()) { break; } } m.appendTail(sb); } return toAppendTo.append(sb.toString()); } }
时间: 2024-10-22 00:51:17