1 16 package org.joda.time.chrono; 17 18 import java.util.HashMap ; 19 import java.util.Map ; 20 21 import org.joda.time.Chronology; 22 import org.joda.time.DateTime; 23 import org.joda.time.DateTimeConstants; 24 import org.joda.time.DateTimeField; 25 import org.joda.time.DateTimeFieldType; 26 import org.joda.time.DateTimeZone; 27 import org.joda.time.field.DelegatedDateTimeField; 28 import org.joda.time.field.DividedDateTimeField; 29 import org.joda.time.field.OffsetDateTimeField; 30 import org.joda.time.field.RemainderDateTimeField; 31 import org.joda.time.field.SkipUndoDateTimeField; 32 33 53 public final class BuddhistChronology extends AssembledChronology { 54 55 56 private static final long serialVersionUID = -3474595157769370126L; 57 58 62 public static final int BE = DateTimeConstants.CE; 63 64 65 private static final DateTimeField ERA_FIELD = new BasicSingleEraDateTimeField("BE"); 66 67 68 private static final int BUDDHIST_OFFSET = 543; 69 70 71 private static final Map cCache = new HashMap (); 72 73 74 private static final BuddhistChronology INSTANCE_UTC = getInstance(DateTimeZone.UTC); 75 76 83 public static BuddhistChronology getInstanceUTC() { 84 return INSTANCE_UTC; 85 } 86 87 92 public static BuddhistChronology getInstance() { 93 return getInstance(DateTimeZone.getDefault()); 94 } 95 96 103 public static synchronized BuddhistChronology getInstance(DateTimeZone zone) { 104 if (zone == null) { 105 zone = DateTimeZone.getDefault(); 106 } 107 BuddhistChronology chrono = (BuddhistChronology) cCache.get(zone); 108 if (chrono == null) { 109 chrono = new BuddhistChronology(GJChronology.getInstance(zone, null), null); 111 DateTime lowerLimit = new DateTime(1, 1, 1, 0, 0, 0, 0, chrono); 113 chrono = new BuddhistChronology(LimitChronology.getInstance(chrono, lowerLimit, null), ""); 114 cCache.put(zone, chrono); 115 } 116 return chrono; 117 } 118 119 122 127 private BuddhistChronology(Chronology base, Object param) { 128 super(base, param); 129 } 130 131 134 private Object readResolve() { 135 Chronology base = getBase(); 136 return base == null ? getInstanceUTC() : getInstance(base.getZone()); 137 } 138 139 146 public Chronology withUTC() { 147 return INSTANCE_UTC; 148 } 149 150 156 public Chronology withZone(DateTimeZone zone) { 157 if (zone == null) { 158 zone = DateTimeZone.getDefault(); 159 } 160 if (zone == getZone()) { 161 return this; 162 } 163 return getInstance(zone); 164 } 165 166 173 public String toString() { 174 String str = "BuddhistChronology"; 175 DateTimeZone zone = getZone(); 176 if (zone != null) { 177 str = str + '[' + zone.getID() + ']'; 178 } 179 return str; 180 } 181 182 protected void assemble(Fields fields) { 183 if (getParam() == null) { 184 DateTimeField field = fields.year; 186 fields.year = new OffsetDateTimeField( 187 new SkipUndoDateTimeField(this, field), BUDDHIST_OFFSET); 188 189 field = fields.yearOfEra; 191 fields.yearOfEra = new DelegatedDateTimeField( 192 fields.year, DateTimeFieldType.yearOfEra()); 193 194 field = fields.weekyear; 196 fields.weekyear = new OffsetDateTimeField( 197 new SkipUndoDateTimeField(this, field), BUDDHIST_OFFSET); 198 199 field = new OffsetDateTimeField(fields.yearOfEra, 99); 200 fields.centuryOfEra = new DividedDateTimeField( 201 field, DateTimeFieldType.centuryOfEra(), 100); 202 203 field = new RemainderDateTimeField( 204 (DividedDateTimeField) fields.centuryOfEra); 205 fields.yearOfCentury = new OffsetDateTimeField( 206 field, DateTimeFieldType.yearOfCentury(), 1); 207 208 field = new RemainderDateTimeField( 209 fields.weekyear, DateTimeFieldType.weekyearOfCentury(), 100); 210 fields.weekyearOfCentury = new OffsetDateTimeField( 211 field, DateTimeFieldType.weekyearOfCentury(), 1); 212 213 fields.era = ERA_FIELD; 214 } 215 } 216 217 } 218 | Popular Tags |