commons-lang阅读(一)
基于commons-lang-2.4.jar
org.apache.commons.lang.time.DateFormatUtils类
package org.apache.commons.lang.time; import java.util.Calendar; import java.util.Date; import java.util.Locale; import java.util.TimeZone; public class DateFormatUtils { public static final FastDateFormat ISO_DATETIME_FORMAT = FastDateFormat.getInstance("yyyy-MM-dd'T'HH:mm:ss"); public static final FastDateFormat ISO_DATETIME_TIME_ZONE_FORMAT = FastDateFormat.getInstance("yyyy-MM-dd'T'HH:mm:ssZZ"); public static final FastDateFormat ISO_DATE_FORMAT = FastDateFormat.getInstance("yyyy-MM-dd"); public static final FastDateFormat ISO_DATE_TIME_ZONE_FORMAT = FastDateFormat.getInstance("yyyy-MM-ddZZ"); public static final FastDateFormat ISO_TIME_FORMAT = FastDateFormat.getInstance("'T'HH:mm:ss"); public static final FastDateFormat ISO_TIME_TIME_ZONE_FORMAT = FastDateFormat.getInstance("'T'HH:mm:ssZZ"); public static final FastDateFormat ISO_TIME_NO_T_FORMAT = FastDateFormat.getInstance("HH:mm:ss"); public static final FastDateFormat ISO_TIME_NO_T_TIME_ZONE_FORMAT = FastDateFormat.getInstance("HH:mm:ssZZ"); public static final FastDateFormat SMTP_DATETIME_FORMAT = FastDateFormat.getInstance("EEE, dd MMM yyyy HH:mm:ss Z", Locale.US); public static String formatUTC(long millis, String pattern) { return format(new Date(millis), pattern, DateUtils.UTC_TIME_ZONE, null); } public static String formatUTC(Date date, String pattern) { return format(date, pattern, DateUtils.UTC_TIME_ZONE, null); } public static String formatUTC(long millis, String pattern, Locale locale) { return format(new Date(millis), pattern, DateUtils.UTC_TIME_ZONE, locale); } public static String formatUTC(Date date, String pattern, Locale locale) { return format(date, pattern, DateUtils.UTC_TIME_ZONE, locale); } public static String format(long millis, String pattern) { return format(new Date(millis), pattern, null, null); } public static String format(Date date, String pattern) { return format(date, pattern, null, null); } public static String format(Calendar calendar, String pattern) { return format(calendar, pattern, null, null); } public static String format(long millis, String pattern, TimeZone timeZone) { return format(new Date(millis), pattern, timeZone, null); } public static String format(Date date, String pattern, TimeZone timeZone) { return format(date, pattern, timeZone, null); } public static String format(Calendar calendar, String pattern, TimeZone timeZone) { return format(calendar, pattern, timeZone, null); } public static String format(long millis, String pattern, Locale locale) { return format(new Date(millis), pattern, null, locale); } public static String format(Date date, String pattern, Locale locale) { return format(date, pattern, null, locale); } public static String format(Calendar calendar, String pattern, Locale locale) { return format(calendar, pattern, null, locale); } public static String format(long millis, String pattern, TimeZone timeZone, Locale locale) { return format(new Date(millis), pattern, timeZone, locale); } public static String format(Date date, String pattern, TimeZone timeZone, Locale locale) { FastDateFormat df = FastDateFormat.getInstance(pattern, timeZone, locale); return df.format(date); } public static String format(Calendar calendar, String pattern, TimeZone timeZone, Locale locale) { FastDateFormat df = FastDateFormat.getInstance(pattern, timeZone, locale); return df.format(calendar); } }
package org.apache.commons.lang.time; import java.io.IOException; import java.io.ObjectInputStream; import java.text.DateFormat; import java.text.DateFormatSymbols; import java.text.FieldPosition; import java.text.Format; import java.text.ParsePosition; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.TimeZone; import org.apache.commons.lang.Validate; public class FastDateFormat extends Format { private static final long serialVersionUID = 1L; public static final int FULL = 0; public static final int LONG = 1; public static final int MEDIUM = 2; public static final int SHORT = 3; private static String cDefaultPattern; private static final Map cInstanceCache = new HashMap(7); private static final Map cDateInstanceCache = new HashMap(7); private static final Map cTimeInstanceCache = new HashMap(7); private static final Map cDateTimeInstanceCache = new HashMap(7); private static final Map cTimeZoneDisplayCache = new HashMap(7); private final String mPattern; private final TimeZone mTimeZone; private final boolean mTimeZoneForced; private final Locale mLocale; private final boolean mLocaleForced; private transient Rule[] mRules; private transient int mMaxLengthEstimate; public static FastDateFormat getInstance() { return getInstance(getDefaultPattern(), null, null); } public static FastDateFormat getInstance(String pattern) { return getInstance(pattern, null, null); } public static FastDateFormat getInstance(String pattern, TimeZone timeZone) { return getInstance(pattern, timeZone, null); } public static FastDateFormat getInstance(String pattern, Locale locale) { return getInstance(pattern, null, locale); } public static synchronized FastDateFormat getInstance(String pattern, TimeZone timeZone, Locale locale) { FastDateFormat emptyFormat = new FastDateFormat(pattern, timeZone, locale); FastDateFormat format = (FastDateFormat)cInstanceCache.get(emptyFormat); if (format == null) { format = emptyFormat; format.init(); cInstanceCache.put(format, format); } return format; } public static FastDateFormat getDateInstance(int style) { return getDateInstance(style, null, null); } public static FastDateFormat getDateInstance(int style, Locale locale) { return getDateInstance(style, null, locale); } public static FastDateFormat getDateInstance(int style, TimeZone timeZone) { return getDateInstance(style, timeZone, null); } public static synchronized FastDateFormat getDateInstance(int style, TimeZone timeZone, Locale locale) { Object key = new Integer(style); if (timeZone != null) { key = new Pair(key, timeZone); } if (locale == null) { locale = Locale.getDefault(); } key = new Pair(key, locale); FastDateFormat format = (FastDateFormat)cDateInstanceCache.get(key); if (format == null) { try { SimpleDateFormat formatter = (SimpleDateFormat)DateFormat.getDateInstance(style, locale); String pattern = formatter.toPattern(); format = getInstance(pattern, timeZone, locale); cDateInstanceCache.put(key, format); } catch (ClassCastException ex) { throw new IllegalArgumentException("No date pattern for locale: " + locale); } } return format; } public static FastDateFormat getTimeInstance(int style) { return getTimeInstance(style, null, null); } public static FastDateFormat getTimeInstance(int style, Locale locale) { return getTimeInstance(style, null, locale); } public static FastDateFormat getTimeInstance(int style, TimeZone timeZone) { return getTimeInstance(style, timeZone, null); } public static synchronized FastDateFormat getTimeInstance(int style, TimeZone timeZone, Locale locale) { Object key = new Integer(style); if (timeZone != null) { key = new Pair(key, timeZone); } if (locale != null) { key = new Pair(key, locale); } FastDateFormat format = (FastDateFormat)cTimeInstanceCache.get(key); if (format == null) { if (locale == null) { locale = Locale.getDefault(); } try { SimpleDateFormat formatter = (SimpleDateFormat)DateFormat.getTimeInstance(style, locale); String pattern = formatter.toPattern(); format = getInstance(pattern, timeZone, locale); cTimeInstanceCache.put(key, format); } catch (ClassCastException ex) { throw new IllegalArgumentException("No date pattern for locale: " + locale); } } return format; } public static FastDateFormat getDateTimeInstance(int dateStyle, int timeStyle) { return getDateTimeInstance(dateStyle, timeStyle, null, null); } public static FastDateFormat getDateTimeInstance(int dateStyle, int timeStyle, Locale locale) { return getDateTimeInstance(dateStyle, timeStyle, null, locale); } public static FastDateFormat getDateTimeInstance(int dateStyle, int timeStyle, TimeZone timeZone) { return getDateTimeInstance(dateStyle, timeStyle, timeZone, null); } public static synchronized FastDateFormat getDateTimeInstance(int dateStyle, int timeStyle, TimeZone timeZone, Locale locale) { Object key = new Pair(new Integer(dateStyle), new Integer(timeStyle)); if (timeZone != null) { key = new Pair(key, timeZone); } if (locale == null) { locale = Locale.getDefault(); } key = new Pair(key, locale); FastDateFormat format = (FastDateFormat)cDateTimeInstanceCache.get(key); if (format == null) { try { SimpleDateFormat formatter = (SimpleDateFormat)DateFormat.getDateTimeInstance(dateStyle, timeStyle, locale); String pattern = formatter.toPattern(); format = getInstance(pattern, timeZone, locale); cDateTimeInstanceCache.put(key, format); } catch (ClassCastException ex) { throw new IllegalArgumentException("No date time pattern for locale: " + locale); } } return format; } static synchronized String getTimeZoneDisplay(TimeZone tz, boolean daylight, int style, Locale locale) { Object key = new TimeZoneDisplayKey(tz, daylight, style, locale); String value = (String)cTimeZoneDisplayCache.get(key); if (value == null) { value = tz.getDisplayName(daylight, style, locale); cTimeZoneDisplayCache.put(key, value); } return value; } private static synchronized String getDefaultPattern() { if (cDefaultPattern == null) { cDefaultPattern = new SimpleDateFormat().toPattern(); } return cDefaultPattern; } protected FastDateFormat(String pattern, TimeZone timeZone, Locale locale) { if (pattern == null) { throw new IllegalArgumentException("The pattern must not be null"); } this.mPattern = pattern; this.mTimeZoneForced = (timeZone != null); if (timeZone == null) { timeZone = TimeZone.getDefault(); } this.mTimeZone = timeZone; this.mLocaleForced = (locale != null); if (locale == null) { locale = Locale.getDefault(); } this.mLocale = locale; } protected void init() { List rulesList = parsePattern(); this.mRules = ((Rule[])rulesList.toArray(new Rule[rulesList.size()])); int len = 0; int i = this.mRules.length; for (;;) { i--; if (i < 0) break; len += this.mRules[i].estimateLength(); } this.mMaxLengthEstimate = len; } protected List parsePattern() { DateFormatSymbols symbols = new DateFormatSymbols(this.mLocale); List rules = new ArrayList(); String[] ERAs = symbols.getEras(); String[] months = symbols.getMonths(); String[] shortMonths = symbols.getShortMonths(); String[] weekdays = symbols.getWeekdays(); String[] shortWeekdays = symbols.getShortWeekdays(); String[] AmPmStrings = symbols.getAmPmStrings(); int length = this.mPattern.length(); int[] indexRef = new int[1]; for (int i = 0; i < length; i++) { indexRef[0] = i; String token = parseToken(this.mPattern, indexRef); i = indexRef[0]; int tokenLen = token.length(); if (tokenLen == 0) { break; } char c = token.charAt(0); Rule rule; Rule rule; Rule rule; Rule rule; Rule rule; Rule rule; Rule rule; Rule rule; Rule rule; Rule rule; Rule rule; Rule rule; Rule rule; Rule rule; Rule rule; Rule rule; Rule rule; Rule rule; Rule rule; Rule rule; switch (c) { case 'G': rule = new TextField(0, ERAs); break; case 'y': Rule rule; if (tokenLen >= 4) { rule = selectNumberRule(1, tokenLen); } else { rule = TwoDigitYearField.INSTANCE; } break; case 'M': Rule rule; if (tokenLen >= 4) { rule = new TextField(2, months); } else { Rule rule; if (tokenLen == 3) { rule = new TextField(2, shortMonths); } else { Rule rule; if (tokenLen == 2) { rule = TwoDigitMonthField.INSTANCE; } else rule = UnpaddedMonthField.INSTANCE; } } break; case 'd': rule = selectNumberRule(5, tokenLen); break; case 'h': rule = new TwelveHourField(selectNumberRule(10, tokenLen)); break; case 'H': rule = selectNumberRule(11, tokenLen); break; case 'm': rule = selectNumberRule(12, tokenLen); break; case 's': rule = selectNumberRule(13, tokenLen); break; case 'S': rule = selectNumberRule(14, tokenLen); break; case 'E': rule = new TextField(7, tokenLen < 4 ? shortWeekdays : weekdays); break; case 'D': rule = selectNumberRule(6, tokenLen); break; case 'F': rule = selectNumberRule(8, tokenLen); break; case 'w': rule = selectNumberRule(3, tokenLen); break; case 'W': rule = selectNumberRule(4, tokenLen); break; case 'a': rule = new TextField(9, AmPmStrings); break; case 'k': rule = new TwentyFourHourField(selectNumberRule(11, tokenLen)); break; case 'K': rule = selectNumberRule(10, tokenLen); break; case 'z': Rule rule; if (tokenLen >= 4) { rule = new TimeZoneNameRule(this.mTimeZone, this.mTimeZoneForced, this.mLocale, 1); } else { rule = new TimeZoneNameRule(this.mTimeZone, this.mTimeZoneForced, this.mLocale, 0); } break; case 'Z': Rule rule; if (tokenLen == 1) { rule = TimeZoneNumberRule.INSTANCE_NO_COLON; } else { rule = TimeZoneNumberRule.INSTANCE_COLON; } break; case '\'': String sub = token.substring(1); Rule rule; if (sub.length() == 1) { rule = new CharacterLiteral(sub.charAt(0)); } else { rule = new StringLiteral(sub); } break; case '(': case ')': case '*': case '+': case ',': case '-': case '.': case '/': case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case ':': case ';': case '<': case '=': case '>': case '?': case '@': case 'A': case 'B': case 'C': case 'I': case 'J': case 'L': case 'N': case 'O': case 'P': case 'Q': case 'R': case 'T': case 'U': case 'V': case 'X': case 'Y': case '[': case '\\': case ']': case '^': case '_': case '`': case 'b': case 'c': case 'e': case 'f': case 'g': case 'i': case 'j': case 'l': case 'n': case 'o': case 'p': case 'q': case 'r': case 't': case 'u': case 'v': case 'x': default: throw new IllegalArgumentException("Illegal pattern component: " + token); } rules.add(rule); } return rules; } protected String parseToken(String pattern, int[] indexRef) { StringBuffer buf = new StringBuffer(); int i = indexRef[0]; int length = pattern.length(); char c = pattern.charAt(i); if (((c >= 'A') && (c <= 'Z')) || ((c >= 'a') && (c <= 'z'))) { buf.append(c); } while (i + 1 < length) { char peek = pattern.charAt(i + 1); if (peek == c) { buf.append(c); i++; continue; buf.append('\''); boolean inLiteral = false; for (; i < length; i++) { c = pattern.charAt(i); if (c == '\'') { if ((i + 1 < length) && (pattern.charAt(i + 1) == '\'')) { i++; buf.append(c); } else { inLiteral = !inLiteral; } } else { if ((!inLiteral) && (((c >= 'A') && (c <= 'Z')) || ((c >= 'a') && (c <= 'z')))) { i--; break; } buf.append(c); } } } } indexRef[0] = i; return buf.toString(); } protected NumberRule selectNumberRule(int field, int padding) { switch (padding) { case 1: return new UnpaddedNumberField(field); case 2: return new TwoDigitNumberField(field); } return new PaddedNumberField(field, padding); } public StringBuffer format(Object obj, StringBuffer toAppendTo, FieldPosition pos) { if ((obj instanceof Date)) return format((Date)obj, toAppendTo); if ((obj instanceof Calendar)) return format((Calendar)obj, toAppendTo); if ((obj instanceof Long)) { return format(((Long)obj).longValue(), toAppendTo); } throw new IllegalArgumentException("Unknown class: " + (obj == null ? "<null>" : obj.getClass().getName())); } public String format(long millis) { return format(new Date(millis)); } public String format(Date date) { Calendar c = new GregorianCalendar(this.mTimeZone); c.setTime(date); return applyRules(c, new StringBuffer(this.mMaxLengthEstimate)).toString(); } public String format(Calendar calendar) { return format(calendar, new StringBuffer(this.mMaxLengthEstimate)).toString(); } public StringBuffer format(long millis, StringBuffer buf) { return format(new Date(millis), buf); } public StringBuffer format(Date date, StringBuffer buf) { Calendar c = new GregorianCalendar(this.mTimeZone); c.setTime(date); return applyRules(c, buf); } public StringBuffer format(Calendar calendar, StringBuffer buf) { if (this.mTimeZoneForced) { calendar = (Calendar)calendar.clone(); calendar.setTimeZone(this.mTimeZone); } return applyRules(calendar, buf); } protected StringBuffer applyRules(Calendar calendar, StringBuffer buf) { Rule[] rules = this.mRules; int len = this.mRules.length; for (int i = 0; i < len; i++) { rules[i].appendTo(buf, calendar); } return buf; } public Object parseObject(String source, ParsePosition pos) { pos.setIndex(0); pos.setErrorIndex(0); return null; } public String getPattern() { return this.mPattern; } public TimeZone getTimeZone() { return this.mTimeZone; } public boolean getTimeZoneOverridesCalendar() { return this.mTimeZoneForced; } public Locale getLocale() { return this.mLocale; } public int getMaxLengthEstimate() { return this.mMaxLengthEstimate; } public boolean equals(Object obj) { if (!(obj instanceof FastDateFormat)) { return false; } FastDateFormat other = (FastDateFormat)obj; if (((this.mPattern == other.mPattern) || (this.mPattern.equals(other.mPattern))) && ((this.mTimeZone == other.mTimeZone) || (this.mTimeZone.equals(other.mTimeZone))) && ((this.mLocale == other.mLocale) || (this.mLocale.equals(other.mLocale))) && (this.mTimeZoneForced == other.mTimeZoneForced) && (this.mLocaleForced == other.mLocaleForced)) { return true; } return false; } public int hashCode() { int total = 0; total += this.mPattern.hashCode(); total += this.mTimeZone.hashCode(); total += (this.mTimeZoneForced ? 1 : 0); total += this.mLocale.hashCode(); total += (this.mLocaleForced ? 1 : 0); return total; } public String toString() { return "FastDateFormat[" + this.mPattern + "]"; } private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { in.defaultReadObject(); init(); } private static abstract interface Rule { public abstract int estimateLength(); public abstract void appendTo(StringBuffer paramStringBuffer, Calendar paramCalendar); } private static abstract interface NumberRule extends FastDateFormat.Rule { public abstract void appendTo(StringBuffer paramStringBuffer, int paramInt); } private static class CharacterLiteral implements FastDateFormat.Rule { private final char mValue; CharacterLiteral(char value) { this.mValue = value; } public int estimateLength() { return 1; } public void appendTo(StringBuffer buffer, Calendar calendar) { buffer.append(this.mValue); } } private static class StringLiteral implements FastDateFormat.Rule { private final String mValue; StringLiteral(String value) { this.mValue = value; } public int estimateLength() { return this.mValue.length(); } public void appendTo(StringBuffer buffer, Calendar calendar) { buffer.append(this.mValue); } } private static class TextField implements FastDateFormat.Rule { private final int mField; private final String[] mValues; TextField(int field, String[] values) { this.mField = field; this.mValues = values; } public int estimateLength() { int max = 0; int i = this.mValues.length; for (;;) { i--; if (i < 0) break; int len = this.mValues[i].length(); if (len > max) { max = len; } } return max; } public void appendTo(StringBuffer buffer, Calendar calendar) { buffer.append(this.mValues[calendar.get(this.mField)]); } } private static class UnpaddedNumberField implements FastDateFormat.NumberRule { static final UnpaddedNumberField INSTANCE_YEAR = new UnpaddedNumberField(1); private final int mField; UnpaddedNumberField(int field) { this.mField = field; } public int estimateLength() { return 4; } public void appendTo(StringBuffer buffer, Calendar calendar) { appendTo(buffer, calendar.get(this.mField)); } public final void appendTo(StringBuffer buffer, int value) { if (value < 10) { buffer.append((char)(value + 48)); } else if (value < 100) { buffer.append((char)(value / 10 + 48)); buffer.append((char)(value % 10 + 48)); } else { buffer.append(Integer.toString(value)); } } } private static class UnpaddedMonthField implements FastDateFormat.NumberRule { static final UnpaddedMonthField INSTANCE = new UnpaddedMonthField(); public int estimateLength() { return 2; } public void appendTo(StringBuffer buffer, Calendar calendar) { appendTo(buffer, calendar.get(2) + 1); } public final void appendTo(StringBuffer buffer, int value) { if (value < 10) { buffer.append((char)(value + 48)); } else { buffer.append((char)(value / 10 + 48)); buffer.append((char)(value % 10 + 48)); } } } private static class PaddedNumberField implements FastDateFormat.NumberRule { private final int mField; private final int mSize; PaddedNumberField(int field, int size) { if (size < 3) { throw new IllegalArgumentException(); } this.mField = field; this.mSize = size; } public int estimateLength() { return 4; } public void appendTo(StringBuffer buffer, Calendar calendar) { appendTo(buffer, calendar.get(this.mField)); } public final void appendTo(StringBuffer buffer, int value) { if (value < 100) { int i = this.mSize; for (;;) { i--; if (i < 2) break; buffer.append('0'); } buffer.append((char)(value / 10 + 48)); buffer.append((char)(value % 10 + 48)); } else { int digits; int digits; if (value < 1000) { digits = 3; } else { Validate.isTrue(value > -1, "Negative values should not be possible", value); digits = Integer.toString(value).length(); } int i = this.mSize; for (;;) { i--; if (i < digits) break; buffer.append('0'); } buffer.append(Integer.toString(value)); } } } private static class TwoDigitNumberField implements FastDateFormat.NumberRule { private final int mField; TwoDigitNumberField(int field) { this.mField = field; } public int estimateLength() { return 2; } public void appendTo(StringBuffer buffer, Calendar calendar) { appendTo(buffer, calendar.get(this.mField)); } public final void appendTo(StringBuffer buffer, int value) { if (value < 100) { buffer.append((char)(value / 10 + 48)); buffer.append((char)(value % 10 + 48)); } else { buffer.append(Integer.toString(value)); } } } private static class TwoDigitYearField implements FastDateFormat.NumberRule { static final TwoDigitYearField INSTANCE = new TwoDigitYearField(); public int estimateLength() { return 2; } public void appendTo(StringBuffer buffer, Calendar calendar) { appendTo(buffer, calendar.get(1) % 100); } public final void appendTo(StringBuffer buffer, int value) { buffer.append((char)(value / 10 + 48)); buffer.append((char)(value % 10 + 48)); } } private static class TwoDigitMonthField implements FastDateFormat.NumberRule { static final TwoDigitMonthField INSTANCE = new TwoDigitMonthField(); public int estimateLength() { return 2; } public void appendTo(StringBuffer buffer, Calendar calendar) { appendTo(buffer, calendar.get(2) + 1); } public final void appendTo(StringBuffer buffer, int value) { buffer.append((char)(value / 10 + 48)); buffer.append((char)(value % 10 + 48)); } } private static class TwelveHourField implements FastDateFormat.NumberRule { private final FastDateFormat.NumberRule mRule; TwelveHourField(FastDateFormat.NumberRule rule) { this.mRule = rule; } public int estimateLength() { return this.mRule.estimateLength(); } public void appendTo(StringBuffer buffer, Calendar calendar) { int value = calendar.get(10); if (value == 0) { value = calendar.getLeastMaximum(10) + 1; } this.mRule.appendTo(buffer, value); } public void appendTo(StringBuffer buffer, int value) { this.mRule.appendTo(buffer, value); } } private static class TwentyFourHourField implements FastDateFormat.NumberRule { private final FastDateFormat.NumberRule mRule; TwentyFourHourField(FastDateFormat.NumberRule rule) { this.mRule = rule; } public int estimateLength() { return this.mRule.estimateLength(); } public void appendTo(StringBuffer buffer, Calendar calendar) { int value = calendar.get(11); if (value == 0) { value = calendar.getMaximum(11) + 1; } this.mRule.appendTo(buffer, value); } public void appendTo(StringBuffer buffer, int value) { this.mRule.appendTo(buffer, value); } } private static class TimeZoneNameRule implements FastDateFormat.Rule { private final TimeZone mTimeZone; private final boolean mTimeZoneForced; private final Locale mLocale; private final int mStyle; private final String mStandard; private final String mDaylight; TimeZoneNameRule(TimeZone timeZone, boolean timeZoneForced, Locale locale, int style) { this.mTimeZone = timeZone; this.mTimeZoneForced = timeZoneForced; this.mLocale = locale; this.mStyle = style; if (timeZoneForced) { this.mStandard = FastDateFormat.getTimeZoneDisplay(timeZone, false, style, locale); this.mDaylight = FastDateFormat.getTimeZoneDisplay(timeZone, true, style, locale); } else { this.mStandard = null; this.mDaylight = null; } } public int estimateLength() { if (this.mTimeZoneForced) return Math.max(this.mStandard.length(), this.mDaylight.length()); if (this.mStyle == 0) { return 4; } return 40; } public void appendTo(StringBuffer buffer, Calendar calendar) { if (this.mTimeZoneForced) { if ((this.mTimeZone.useDaylightTime()) && (calendar.get(16) != 0)) { buffer.append(this.mDaylight); } else { buffer.append(this.mStandard); } } else { TimeZone timeZone = calendar.getTimeZone(); if ((timeZone.useDaylightTime()) && (calendar.get(16) != 0)) { buffer.append(FastDateFormat.getTimeZoneDisplay(timeZone, true, this.mStyle, this.mLocale)); } else { buffer.append(FastDateFormat.getTimeZoneDisplay(timeZone, false, this.mStyle, this.mLocale)); } } } } private static class TimeZoneNumberRule implements FastDateFormat.Rule { static final TimeZoneNumberRule INSTANCE_COLON = new TimeZoneNumberRule(true); static final TimeZoneNumberRule INSTANCE_NO_COLON = new TimeZoneNumberRule(false); final boolean mColon; TimeZoneNumberRule(boolean colon) { this.mColon = colon; } public int estimateLength() { return 5; } public void appendTo(StringBuffer buffer, Calendar calendar) { int offset = calendar.get(15) + calendar.get(16); if (offset < 0) { buffer.append('-'); offset = -offset; } else { buffer.append('+'); } int hours = offset / 3600000; buffer.append((char)(hours / 10 + 48)); buffer.append((char)(hours % 10 + 48)); if (this.mColon) { buffer.append(':'); } int minutes = offset / 60000 - 60 * hours; buffer.append((char)(minutes / 10 + 48)); buffer.append((char)(minutes % 10 + 48)); } } private static class TimeZoneDisplayKey { private final TimeZone mTimeZone; private final int mStyle; private final Locale mLocale; TimeZoneDisplayKey(TimeZone timeZone, boolean daylight, int style, Locale locale) { this.mTimeZone = timeZone; if (daylight) { style |= -2147483648; } this.mStyle = style; this.mLocale = locale; } public int hashCode() { return this.mStyle * 31 + this.mLocale.hashCode(); } public boolean equals(Object obj) { if (this == obj) { return true; } if ((obj instanceof TimeZoneDisplayKey)) { TimeZoneDisplayKey other = (TimeZoneDisplayKey)obj; return (this.mTimeZone.equals(other.mTimeZone)) && (this.mStyle == other.mStyle) && (this.mLocale.equals(other.mLocale)); } return false; } } private static class Pair { private final Object mObj1; private final Object mObj2; public Pair(Object obj1, Object obj2) { this.mObj1 = obj1; this.mObj2 = obj2; } public boolean equals(Object obj) { if (this == obj) { return true; } if (!(obj instanceof Pair)) { return false; } Pair key = (Pair)obj; return (this.mObj1 == null ? key.mObj1 == null : this.mObj1.equals(key.mObj1)) && (this.mObj2 == null ? key.mObj2 == null : this.mObj2.equals(key.mObj2)); } public int hashCode() { return (this.mObj1 == null ? 0 : this.mObj1.hashCode()) + (this.mObj2 == null ? 0 : this.mObj2.hashCode()); } public String toString() { return "[" + this.mObj1 + ':' + this.mObj2 + ']'; } } }
package org.apache.commons.lang; import java.util.Collection; import java.util.Iterator; import java.util.Map; public class Validate { public static void isTrue(boolean expression, String message, Object value) { if (!expression) { throw new IllegalArgumentException(message + value); } } public static void isTrue(boolean expression, String message, long value) { if (!expression) { throw new IllegalArgumentException(message + value); } } public static void isTrue(boolean expression, String message, double value) { if (!expression) { throw new IllegalArgumentException(message + value); } } public static void isTrue(boolean expression, String message) { if (!expression) { throw new IllegalArgumentException(message); } } public static void isTrue(boolean expression) { if (!expression) { throw new IllegalArgumentException("The validated expression is false"); } } public static void notNull(Object object, String message) { if (object == null) { throw new IllegalArgumentException(message); } } public static void notNull(Object object) { if (object == null) { throw new IllegalArgumentException("The validated object is null"); } } public static void notEmpty(Object[] array, String message) { if ((array == null) || (array.length == 0)) { throw new IllegalArgumentException(message); } } public static void notEmpty(Object[] array) { if ((array == null) || (array.length == 0)) { throw new IllegalArgumentException("The validated array is empty"); } } public static void notEmpty(Collection collection, String message) { if ((collection == null) || (collection.size() == 0)) { throw new IllegalArgumentException(message); } } public static void notEmpty(Collection collection) { if ((collection == null) || (collection.size() == 0)) { throw new IllegalArgumentException("The validated collection is empty"); } } public static void notEmpty(Map map, String message) { if ((map == null) || (map.size() == 0)) { throw new IllegalArgumentException(message); } } public static void notEmpty(Map map) { if ((map == null) || (map.size() == 0)) { throw new IllegalArgumentException("The validated map is empty"); } } public static void notEmpty(String string, String message) { if ((string == null) || (string.length() == 0)) { throw new IllegalArgumentException(message); } } public static void notEmpty(String string) { if ((string == null) || (string.length() == 0)) { throw new IllegalArgumentException("The validated string is empty"); } } public static void noNullElements(Object[] array, String message) { notNull(array); for (int i = 0; i < array.length; i++) { if (array[i] == null) { throw new IllegalArgumentException(message); } } } public static void noNullElements(Object[] array) { notNull(array); for (int i = 0; i < array.length; i++) { if (array[i] == null) { throw new IllegalArgumentException("The validated array contains null element at index: " + i); } } } public static void noNullElements(Collection collection, String message) { notNull(collection); for (Iterator it = collection.iterator(); it.hasNext();) { if (it.next() == null) { throw new IllegalArgumentException(message); } } } public static void noNullElements(Collection collection) { notNull(collection); int i = 0; for (Iterator it = collection.iterator(); it.hasNext(); i++) { if (it.next() == null) { throw new IllegalArgumentException("The validated collection contains null element at index: " + i); } } } public static void allElementsOfType(Collection collection, Class clazz, String message) { notNull(collection); notNull(clazz); for (Iterator it = collection.iterator(); it.hasNext();) { if (!clazz.isInstance(it.next())) { throw new IllegalArgumentException(message); } } } public static void allElementsOfType(Collection collection, Class clazz) { notNull(collection); notNull(clazz); int i = 0; for (Iterator it = collection.iterator(); it.hasNext(); i++) { if (!clazz.isInstance(it.next())) { throw new IllegalArgumentException("The validated collection contains an element not of type " + clazz.getName() + " at index: " + i); } } } }
import java.util.Calendar; import org.apache.commons.lang.time.DateFormatUtils; import org.junit.Test; /** * @author 作者 E-mail: * @version 创建时间:2015-11-3 下午06:50:56 类说明 */ public class TestDateFormatUtils { @Test public void test() { final Calendar calendar = Calendar.getInstance(); //yyyy-MM-dd'T'HH:mm:ss final String ISO_DATETIME_FORMATE = DateFormatUtils.ISO_DATETIME_FORMAT.format(Calendar.getInstance()); System.out.println("ISO_DATETIME_FORMATE " + ISO_DATETIME_FORMATE + '\n'); //yyyy-MM-dd'T'HH:mm:ssZZ final String ISO_DATETIME_TIME_ZONE_FORMAT = DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT.format(calendar); System.out.println("ISO_DATETIME_TIME_ZONE_FORMAT " + ISO_DATETIME_TIME_ZONE_FORMAT + '\n'); //yyyy-MM-dd final String ISO_DATE_FORMAT = DateFormatUtils.ISO_DATE_FORMAT.format(calendar); System.out.println("ISO_DATE_FORMAT " + ISO_DATE_FORMAT + '\n'); //yyyy-MM-ddZZ final String ISO_DATE_TIME_ZONE_FORMAT = DateFormatUtils.ISO_DATE_TIME_ZONE_FORMAT.format(Calendar.getInstance()); System.out.println("ISO_DATE_TIME_ZONE_FORMAT " + ISO_DATE_TIME_ZONE_FORMAT + '\n'); //'T'HH:mm:ss final String ISO_TIME_FORMAT = DateFormatUtils.ISO_TIME_FORMAT .format(calendar); System.out.println("ISO_TIME_FORMAT " + ISO_TIME_FORMAT + '\n'); //'T'HH:mm:ssZZ final String ISO_TIME_TIME_ZONE_FORMAT = DateFormatUtils.ISO_TIME_TIME_ZONE_FORMAT.format(calendar); System.out.println("ISO_TIME_TIME_ZONE_FORMAT " + ISO_TIME_TIME_ZONE_FORMAT + '\n'); } }
ISO_DATETIME_FORMATE 2015-11-03T19:24:07 ISO_DATETIME_TIME_ZONE_FORMAT 2015-11-03T19:24:07+08:00 ISO_DATE_FORMAT 2015-11-03 ISO_DATE_TIME_ZONE_FORMAT 2015-11-03+08:00 ISO_TIME_FORMAT T19:24:07 ISO_TIME_TIME_ZONE_FORMAT T19:24:07+08:00