in gflog-core/src/main/java/com/epam/deltix/gflog/core/layout/template/FastDateFormat.java [137:222]
private Rule createRule(final char c,
final String token,
final int tokenLen,
final String[] eras,
final String[] months,
final String[] shortMonths,
final String[] weekdays,
final String[] shortWeekdays,
final String[] amPmStrings) {
switch (c) {
case 'G': // era designator (text)
return new TextField(Calendar.ERA, eras);
case 'y': // year (number)
return tokenLen >= 4 ?
selectNumberRule(Calendar.YEAR, tokenLen) :
TwoDigitYearField.INSTANCE;
case 'M': // month in year (text and number)
return tokenLen >= 4 ? new TextField(Calendar.MONTH, months) :
tokenLen == 3 ? new TextField(Calendar.MONTH, shortMonths) :
tokenLen == 2 ? TwoDigitMonthField.INSTANCE :
UnpaddedMonthField.INSTANCE;
case 'd': // day in month (number)
return selectNumberRule(Calendar.DAY_OF_MONTH, tokenLen);
case 'h': // hour in am/pm (number, 1..12)
return new TwelveHourField(selectNumberRule(Calendar.HOUR, tokenLen));
case 'H': // hour in day (number, 0..23)
return selectNumberRule(Calendar.HOUR_OF_DAY, tokenLen);
case 'm': // minute in hour (number)
return selectNumberRule(Calendar.MINUTE, tokenLen);
case 's': // second in minute (number)
return selectNumberRule(Calendar.SECOND, tokenLen);
case 'S': // millisecond (number)
return selectSubSecondField(Calendar.MILLISECOND, tokenLen);
case 'E': // day in week (text)
return new TextField(Calendar.DAY_OF_WEEK, tokenLen < 4 ? shortWeekdays : weekdays);
case 'D': // day in year (number)
return selectNumberRule(Calendar.DAY_OF_YEAR, tokenLen);
case 'F': // day of week in month (number)
return selectNumberRule(Calendar.DAY_OF_WEEK_IN_MONTH, tokenLen);
case 'w': // week in year (number)
return selectNumberRule(Calendar.WEEK_OF_YEAR, tokenLen);
case 'W': // week in month (number)
return selectNumberRule(Calendar.WEEK_OF_MONTH, tokenLen);
case 'a': // am/pm marker (text)
return new TextField(Calendar.AM_PM, amPmStrings);
case 'k': // hour in day (1..24)
return new TwentyFourHourField(selectNumberRule(Calendar.HOUR_OF_DAY, tokenLen));
case 'K': // hour in am/pm (0..11)
return selectNumberRule(Calendar.HOUR, tokenLen);
case 'z': // time zone (text)
return (tokenLen >= 4) ?
new TimeZoneNameRule(mTimeZone, mTimeZoneForced, mLocale, TimeZone.LONG) :
new TimeZoneNameRule(mTimeZone, mTimeZoneForced, mLocale, TimeZone.SHORT);
case 'Z': // time zone (value)
return (tokenLen == 1) ?
TimeZoneNumberRule.INSTANCE_NO_COLON :
TimeZoneNumberRule.INSTANCE_COLON;
case '\'': // literal text
final String sub = token.substring(1);
return (sub.length() == 1) ?
new CharacterLiteral(sub.charAt(0)) :
new StringLiteral(sub);
default:
throw new IllegalArgumentException("Illegal pattern component: " + token);
}
}