📄 fastdateformat.java
字号:
*
* @param date the date to format
* @return the formatted string
*/
public String format(Date date) {
Calendar c = new GregorianCalendar(mTimeZone);
c.setTime(date);
return applyRules(c, new StringBuffer(mMaxLengthEstimate)).toString();
}
/**
* <p>Formats a <code>Calendar</code> object.</p>
*
* @param calendar the calendar to format
* @return the formatted string
*/
public String format(Calendar calendar) {
return format(calendar, new StringBuffer(mMaxLengthEstimate)).toString();
}
/**
* <p>Formats a <code>Date</code> object into the
* supplied <code>StringBuffer</code>.</p>
*
* @param date the date to format
* @param buf the buffer to format into
* @return the specified string buffer
*/
public StringBuffer format(Date date, StringBuffer buf) {
Calendar c = new GregorianCalendar(mTimeZone);
c.setTime(date);
return applyRules(c, buf);
}
/**
* <p>Formats a <code>Calendar</code> object into the
* supplied <code>StringBuffer</code>.</p>
*
* @param calendar the calendar to format
* @param buf the buffer to format into
* @return the specified string buffer
*/
public StringBuffer format(Calendar calendar, StringBuffer buf) {
if (mTimeZoneForced) {
calendar = (Calendar) calendar.clone();
calendar.setTimeZone(mTimeZone);
}
return applyRules(calendar, buf);
}
/**
* <p>Performs the formatting by applying the rules to the
* specified calendar.</p>
*
* @param calendar the calendar to format
* @param buf the buffer to format into
* @return the specified string buffer
*/
protected StringBuffer applyRules(Calendar calendar, StringBuffer buf) {
Rule[] rules = mRules;
int len = mRules.length;
for (int i = 0; i < len; i++) {
rules[i].appendTo(buf, calendar);
}
return buf;
}
// Parsing
//-----------------------------------------------------------------------
/**
* <p>Parsing not supported.</p>
*
* @param source the string to parse
* @param pos the parsing position
* @return <code>null</code> as not supported
*/
public Object parseObject(String source, ParsePosition pos) {
pos.setIndex(0);
pos.setErrorIndex(0);
return null;
}
// Accessors
//-----------------------------------------------------------------------
/**
* <p>Gets the pattern used by this formatter.</p>
*
* @return the pattern, {@link java.text.SimpleDateFormat} compatible
*/
public String getPattern() {
return mPattern;
}
/**
* <p>Gets the time zone used by this formatter.</p>
*
* <p>This zone is always used for <code>Date</code> formatting.
* If a <code>Calendar</code> is passed in to be formatted, the
* time zone on that may be used depending on
* {@link #getTimeZoneOverridesCalendar()}.</p>
*
* @return the time zone
*/
public TimeZone getTimeZone() {
return mTimeZone;
}
/**
* <p>Returns <code>true</code> if the time zone of the
* calendar overrides the time zone of the formatter.</p>
*
* @return <code>true</code> if time zone of formatter
* overridden for calendars
*/
public boolean getTimeZoneOverridesCalendar() {
return mTimeZoneForced;
}
/**
* <p>Gets the locale used by this formatter.</p>
*
* @return the locale
*/
public Locale getLocale() {
return mLocale;
}
/**
* <p>Gets an estimate for the maximum string length that the
* formatter will produce.</p>
*
* <p>The actual formatted length will almost always be less than or
* equal to this amount.</p>
*
* @return the maximum formatted length
*/
public int getMaxLengthEstimate() {
return mMaxLengthEstimate;
}
// Basics
//-----------------------------------------------------------------------
/**
* <p>Compare two objects for equality.</p>
*
* @param obj the object to compare to
* @return <code>true</code> if equal
*/
public boolean equals(Object obj) {
if (obj instanceof FastDateFormat == false) {
return false;
}
FastDateFormat other = (FastDateFormat) obj;
if (
(mPattern == other.mPattern || mPattern.equals(other.mPattern)) &&
(mTimeZone == other.mTimeZone || mTimeZone.equals(other.mTimeZone)) &&
(mLocale == other.mLocale || mLocale.equals(other.mLocale)) &&
(mTimeZoneForced == other.mTimeZoneForced) &&
(mLocaleForced == other.mLocaleForced)
) {
return true;
}
return false;
}
/**
* <p>A suitable hashcode.</p>
*
* @return a hashcode compatable with equals
*/
public int hashCode() {
int total = 0;
total += mPattern.hashCode();
total += mTimeZone.hashCode();
total += (mTimeZoneForced ? 1 : 0);
total += mLocale.hashCode();
total += (mLocaleForced ? 1 : 0);
return total;
}
/**
* <p>Gets a debugging string version of this formatter.</p>
*
* @return a debugging string
*/
public String toString() {
return "FastDateFormat[" + mPattern + "]";
}
// Rules
//-----------------------------------------------------------------------
/**
* <p>Inner class defining a rule.</p>
*/
private interface Rule {
int estimateLength();
void appendTo(StringBuffer buffer, Calendar calendar);
}
/**
* <p>Inner class defining a numeric rule.</p>
*/
private interface NumberRule extends Rule {
void appendTo(StringBuffer buffer, int value);
}
/**
* <p>Inner class to output a constant single character.</p>
*/
private static class CharacterLiteral implements Rule {
private final char mValue;
CharacterLiteral(char value) {
mValue = value;
}
public int estimateLength() {
return 1;
}
public void appendTo(StringBuffer buffer, Calendar calendar) {
buffer.append(mValue);
}
}
/**
* <p>Inner class to output a constant string.</p>
*/
private static class StringLiteral implements Rule {
private final String mValue;
StringLiteral(String value) {
mValue = value;
}
public int estimateLength() {
return mValue.length();
}
public void appendTo(StringBuffer buffer, Calendar calendar) {
buffer.append(mValue);
}
}
/**
* <p>Inner class to output one of a set of values.</p>
*/
private static class TextField implements Rule {
private final int mField;
private final String[] mValues;
TextField(int field, String[] values) {
mField = field;
mValues = values;
}
public int estimateLength() {
int max = 0;
for (int i=mValues.length; --i >= 0; ) {
int len = mValues[i].length();
if (len > max) {
max = len;
}
}
return max;
}
public void appendTo(StringBuffer buffer, Calendar calendar) {
buffer.append(mValues[calendar.get(mField)]);
}
}
/**
* <p>Inner class to output an unpadded number.</p>
*/
private static class UnpaddedNumberField implements NumberRule {
static final UnpaddedNumberField INSTANCE_YEAR = new UnpaddedNumberField(Calendar.YEAR);
private final int mField;
UnpaddedNumberField(int field) {
mField = field;
}
public int estimateLength() {
return 4;
}
public void appendTo(StringBuffer buffer, Calendar calendar) {
appendTo(buffer, calendar.get(mField));
}
public final void appendTo(StringBuffer buffer, int value) {
if (value < 10) {
buffer.append((char)(value + '0'));
} else if (value < 100) {
buffer.append((char)(value / 10 + '0'));
buffer.append((char)(value % 10 + '0'));
} else {
buffer.append(Integer.toString(value));
}
}
}
/**
* <p>Inner class to output an unpadded month.</p>
*/
private static class UnpaddedMonthField implements NumberRule {
static final UnpaddedMonthField INSTANCE = new UnpaddedMonthField();
UnpaddedMonthField() {
}
public int estimateLength() {
return 2;
}
public void appendTo(StringBuffer buffer, Calendar calendar) {
appendTo(buffer, calendar.get(Calendar.MONTH) + 1);
}
public final void appendTo(StringBuffer buffer, int value) {
if (value < 10) {
buffer.append((char)(value + '0'));
} else {
buffer.append((char)(value / 10 + '0'));
buffer.append((char)(value % 10 + '0'));
}
}
}
/**
* <p>Inner class to output a padded number.</p>
*/
private static class PaddedNumberField implements NumberRule {
private final int mField;
private final int mSize;
PaddedNumberField(int field, int size) {
if (size < 3) {
// Should use UnpaddedNumberField or TwoDigitNumberField.
throw new IllegalArgumentException();
}
mField = field;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -