| 1 32 package net.sf.retrotranslator.runtime.format; 33 34 import java.text.SimpleDateFormat ; 35 import java.util.*; 36 37 40 abstract class DateTimeConversion extends Conversion { 41 42 public static Map<Character , DateTimeConversion> getConversions() { 43 HashMap<Character , DateTimeConversion> map = new HashMap<Character , DateTimeConversion>(); 44 map.put('H', new PatternConversion("HH")); 45 map.put('I', new PatternConversion("hh")); 46 map.put('k', new PatternConversion("H")); 47 map.put('l', new PatternConversion("h")); 48 map.put('M', new PatternConversion("mm")); 49 map.put('S', new PatternConversion("ss")); 50 map.put('L', new PatternConversion("SSS")); 51 map.put('N', new PatternConversion("SSS000000")); 52 map.put('p', new PatternConversion("a", true)); 53 map.put('z', new TimeZoneOffsetConversion()); 54 map.put('Z', new PatternConversion("z")); 55 map.put('s', new MillisConversion(1000)); 56 map.put('Q', new MillisConversion(1)); 57 map.put('B', new PatternConversion("MMMM")); 58 map.put('b', new PatternConversion("MMM")); 59 map.put('h', new PatternConversion("MMM")); 60 map.put('A', new PatternConversion("EEEE")); 61 map.put('a', new PatternConversion("EEE")); 62 map.put('C', new CenturyConversion()); 63 map.put('Y', new PatternConversion("yyyy")); 64 map.put('y', new PatternConversion("yy")); 65 map.put('j', new PatternConversion("DDD")); 66 map.put('m', new PatternConversion("MM")); 67 map.put('d', new PatternConversion("dd")); 68 map.put('e', new PatternConversion("d")); 69 map.put('R', new PatternConversion("HH:mm")); 70 map.put('T', new PatternConversion("HH:mm:ss")); 71 map.put('r', new PatternConversion("hh:mm:ss a")); 72 map.put('D', new PatternConversion("MM/dd/yy")); 73 map.put('F', new PatternConversion("yyyy-MM-dd")); 74 map.put('c', new PatternConversion("EEE MMM dd HH:mm:ss z yyyy")); 75 return map; 76 } 77 78 public void format(FormatContext context) { 79 context.assertNoPrecision(); 80 context.assertNoFlag('#'); 81 context.checkWidth(); 82 Object argument = context.getArgument(); 83 if (argument == null) { 84 context.writePadded(String.valueOf(argument)); 85 } else { 86 printf(context); 87 } 88 } 89 90 protected abstract void printf(FormatContext context); 91 92 protected static Calendar getCalendar(FormatContext context) { 93 Object argument = context.getArgument(); 94 Calendar calendar; 95 if (argument instanceof Date) { 96 calendar = new GregorianCalendar(); 97 calendar.setTime((Date) argument); 98 } else if (argument instanceof Calendar) { 99 calendar = (Calendar) argument; 100 } else if (argument instanceof Long ) { 101 calendar = new GregorianCalendar(); 102 calendar.setTimeInMillis((Long ) argument); 103 } else { 104 throw context.getConversionException(); 105 } 106 return calendar; 107 } 108 109 private static class PatternConversion extends DateTimeConversion { 110 111 private String pattern; 112 private boolean toLowerCase; 113 114 public PatternConversion(String pattern) { 115 this.pattern = pattern; 116 } 117 118 public PatternConversion(String pattern, boolean toLowerCase) { 119 this.pattern = pattern; 120 this.toLowerCase = toLowerCase; 121 } 122 123 protected void printf(FormatContext context) { 124 Locale locale = context.getLocale(); 125 if (locale == null) { 126 locale = Locale.US; 127 } 128 SimpleDateFormat format = new SimpleDateFormat (pattern, locale); 129 Object argument = context.getArgument(); 130 Date date; 131 if (argument instanceof Date) { 132 date = (Date) argument; 133 } else if (argument instanceof Calendar) { 134 Calendar calendar = (Calendar) argument; 135 format.setTimeZone(calendar.getTimeZone()); 136 date = calendar.getTime(); 137 } else if (argument instanceof Long ) { 138 date = new Date((Long ) argument); 139 } else { 140 throw context.getConversionException(); 141 } 142 String result = format.format(date); 143 if (toLowerCase) { 144 result = result.toLowerCase(locale); 145 } 146 context.writePadded(result); 147 } 148 } 149 150 private static class MillisConversion extends DateTimeConversion { 151 152 private long divisor; 153 154 public MillisConversion(long divisor) { 155 this.divisor = divisor; 156 } 157 158 protected void printf(FormatContext context) { 159 Object argument = context.getArgument(); 160 long millis; 161 if (argument instanceof Date) { 162 millis = ((Date) argument).getTime(); 163 } else if (argument instanceof Calendar) { 164 millis = ((Calendar) argument).getTimeInMillis(); 165 } else if (argument instanceof Long ) { 166 millis = (Long ) argument; 167 } else { 168 throw context.getConversionException(); 169 } 170 context.writePadded(String.valueOf(millis / divisor)); 171 } 172 } 173 174 private static class TimeZoneOffsetConversion extends DateTimeConversion { 175 176 protected void printf(FormatContext context) { 177 int offset = getCalendar(context).get(Calendar.ZONE_OFFSET) / 60000; 178 StringBuilder builder = new StringBuilder (5).append(offset < 0 ? '-' : '+'); 179 int value = offset < 0 ? -offset : offset; 180 String s = Integer.toString(value / 60 * 100 + value % 60); 181 for (int i = 4 - s.length(); i > 0; i--) { 182 builder.append('0'); 183 } 184 context.writePadded(builder.append(s).toString()); 185 } 186 } 187 188 private static class CenturyConversion extends DateTimeConversion { 189 190 protected void printf(FormatContext context) { 191 int century = getCalendar(context).get(Calendar.YEAR) / 100; 192 if (century < 10) { 193 char[] chars = Integer.toString(century + 10).toCharArray(); 194 chars[0] = '0'; 195 context.writePadded(new String (chars)); 196 } else { 197 context.writePadded(Integer.toString(century)); 198 } 199 } 200 } 201 202 } 203 | Popular Tags |