Package org.joda.time.tz
Class DateTimeZoneBuilder
- java.lang.Object
-
- org.joda.time.tz.DateTimeZoneBuilder
-
public class DateTimeZoneBuilder extends java.lang.Object
DateTimeZoneBuilder allows complex DateTimeZones to be constructed. Since creating a new DateTimeZone this way is a relatively expensive operation, built zones can be written to a file. Reading back the encoded data is a quick operation.DateTimeZoneBuilder itself is mutable and not thread-safe, but the DateTimeZone objects that it builds are thread-safe and immutable.
It is intended that
ZoneInfoCompiler
be used to read time zone data files, indirectly calling DateTimeZoneBuilder. The following complex example defines the America/Los_Angeles time zone, with all historical transitions:DateTimeZone America_Los_Angeles = new DateTimeZoneBuilder() .addCutover(-2147483648, 'w', 1, 1, 0, false, 0) .setStandardOffset(-28378000) .setFixedSavings("LMT", 0) .addCutover(1883, 'w', 11, 18, 0, false, 43200000) .setStandardOffset(-28800000) .addRecurringSavings("PDT", 3600000, 1918, 1919, 'w', 3, -1, 7, false, 7200000) .addRecurringSavings("PST", 0, 1918, 1919, 'w', 10, -1, 7, false, 7200000) .addRecurringSavings("PWT", 3600000, 1942, 1942, 'w', 2, 9, 0, false, 7200000) .addRecurringSavings("PPT", 3600000, 1945, 1945, 'u', 8, 14, 0, false, 82800000) .addRecurringSavings("PST", 0, 1945, 1945, 'w', 9, 30, 0, false, 7200000) .addRecurringSavings("PDT", 3600000, 1948, 1948, 'w', 3, 14, 0, false, 7200000) .addRecurringSavings("PST", 0, 1949, 1949, 'w', 1, 1, 0, false, 7200000) .addRecurringSavings("PDT", 3600000, 1950, 1966, 'w', 4, -1, 7, false, 7200000) .addRecurringSavings("PST", 0, 1950, 1961, 'w', 9, -1, 7, false, 7200000) .addRecurringSavings("PST", 0, 1962, 1966, 'w', 10, -1, 7, false, 7200000) .addRecurringSavings("PST", 0, 1967, 2147483647, 'w', 10, -1, 7, false, 7200000) .addRecurringSavings("PDT", 3600000, 1967, 1973, 'w', 4, -1, 7, false, 7200000) .addRecurringSavings("PDT", 3600000, 1974, 1974, 'w', 1, 6, 0, false, 7200000) .addRecurringSavings("PDT", 3600000, 1975, 1975, 'w', 2, 23, 0, false, 7200000) .addRecurringSavings("PDT", 3600000, 1976, 1986, 'w', 4, -1, 7, false, 7200000) .addRecurringSavings("PDT", 3600000, 1987, 2147483647, 'w', 4, 1, 7, true, 7200000) .toDateTimeZone("America/Los_Angeles", true);
- Since:
- 1.0
- See Also:
ZoneInfoCompiler
,ZoneInfoProvider
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description private static class
DateTimeZoneBuilder.DSTZone
private static class
DateTimeZoneBuilder.OfYear
Supports setting fields of year and moving between transitions.private static class
DateTimeZoneBuilder.PrecalculatedZone
private static class
DateTimeZoneBuilder.Recurrence
Extends OfYear with a nameKey and savings.private static class
DateTimeZoneBuilder.Rule
Extends Recurrence with inclusive year limits.private static class
DateTimeZoneBuilder.RuleSet
private static class
DateTimeZoneBuilder.Transition
-
Field Summary
Fields Modifier and Type Field Description private java.util.ArrayList<DateTimeZoneBuilder.RuleSet>
iRuleSets
-
Constructor Summary
Constructors Constructor Description DateTimeZoneBuilder()
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description DateTimeZoneBuilder
addCutover(int year, char mode, int monthOfYear, int dayOfMonth, int dayOfWeek, boolean advanceDayOfWeek, int millisOfDay)
Adds a cutover for added rules.DateTimeZoneBuilder
addRecurringSavings(java.lang.String nameKey, int saveMillis, int fromYear, int toYear, char mode, int monthOfYear, int dayOfMonth, int dayOfWeek, boolean advanceDayOfWeek, int millisOfDay)
Add a recurring daylight saving time rule.private boolean
addTransition(java.util.ArrayList<DateTimeZoneBuilder.Transition> transitions, DateTimeZoneBuilder.Transition tr)
private static DateTimeZone
buildFixedZone(java.lang.String id, java.lang.String nameKey, int wallOffset, int standardOffset)
private DateTimeZoneBuilder.RuleSet
getLastRuleSet()
static DateTimeZone
readFrom(java.io.DataInput in, java.lang.String id)
Decodes a built DateTimeZone from the given stream, as encoded by writeTo.static DateTimeZone
readFrom(java.io.InputStream in, java.lang.String id)
Decodes a built DateTimeZone from the given stream, as encoded by writeTo.(package private) static long
readMillis(java.io.DataInput in)
Reads encoding generated by writeMillis.DateTimeZoneBuilder
setFixedSavings(java.lang.String nameKey, int saveMillis)
Set a fixed savings rule at the cutover.DateTimeZoneBuilder
setStandardOffset(int standardOffset)
Sets the standard offset to use for newly added rules until the next cutover is added.DateTimeZone
toDateTimeZone(java.lang.String id, boolean outputID)
Processes all the rules and builds a DateTimeZone.(package private) static void
writeMillis(java.io.DataOutput out, long millis)
Millisecond encoding formats: upper two bits units field length approximate range --------------------------------------------------------------- 00 30 minutes 1 byte +/- 16 hours 01 minutes 4 bytes +/- 1020 years 10 seconds 5 bytes +/- 4355 years 11 millis 9 bytes +/- 292,000,000 years Remaining bits in field form signed offset from 1970-01-01T00:00:00Z.void
writeTo(java.lang.String zoneID, java.io.DataOutput out)
Encodes a built DateTimeZone to the given stream.void
writeTo(java.lang.String zoneID, java.io.OutputStream out)
Encodes a built DateTimeZone to the given stream.
-
-
-
Field Detail
-
iRuleSets
private final java.util.ArrayList<DateTimeZoneBuilder.RuleSet> iRuleSets
-
-
Method Detail
-
readFrom
public static DateTimeZone readFrom(java.io.InputStream in, java.lang.String id) throws java.io.IOException
Decodes a built DateTimeZone from the given stream, as encoded by writeTo.- Parameters:
in
- input stream to read encoded DateTimeZone from.id
- time zone id to assign- Throws:
java.io.IOException
-
readFrom
public static DateTimeZone readFrom(java.io.DataInput in, java.lang.String id) throws java.io.IOException
Decodes a built DateTimeZone from the given stream, as encoded by writeTo.- Parameters:
in
- input stream to read encoded DateTimeZone from.id
- time zone id to assign- Throws:
java.io.IOException
-
writeMillis
static void writeMillis(java.io.DataOutput out, long millis) throws java.io.IOException
Millisecond encoding formats: upper two bits units field length approximate range --------------------------------------------------------------- 00 30 minutes 1 byte +/- 16 hours 01 minutes 4 bytes +/- 1020 years 10 seconds 5 bytes +/- 4355 years 11 millis 9 bytes +/- 292,000,000 years Remaining bits in field form signed offset from 1970-01-01T00:00:00Z.- Throws:
java.io.IOException
-
readMillis
static long readMillis(java.io.DataInput in) throws java.io.IOException
Reads encoding generated by writeMillis.- Throws:
java.io.IOException
-
buildFixedZone
private static DateTimeZone buildFixedZone(java.lang.String id, java.lang.String nameKey, int wallOffset, int standardOffset)
-
addCutover
public DateTimeZoneBuilder addCutover(int year, char mode, int monthOfYear, int dayOfMonth, int dayOfWeek, boolean advanceDayOfWeek, int millisOfDay)
Adds a cutover for added rules. The standard offset at the cutover defaults to 0. Call setStandardOffset afterwards to change it.- Parameters:
year
- the year of cutovermode
- 'u' - cutover is measured against UTC, 'w' - against wall offset, 's' - against standard offsetmonthOfYear
- the month from 1 (January) to 12 (December)dayOfMonth
- if negative, set to ((last day of month) - ~dayOfMonth). For example, if -1, set to last day of monthdayOfWeek
- from 1 (Monday) to 7 (Sunday), if 0 then ignoreadvanceDayOfWeek
- if dayOfMonth does not fall on dayOfWeek, advance to dayOfWeek when true, retreat when false.millisOfDay
- additional precision for specifying time of day of cutover
-
setStandardOffset
public DateTimeZoneBuilder setStandardOffset(int standardOffset)
Sets the standard offset to use for newly added rules until the next cutover is added.- Parameters:
standardOffset
- the standard offset in millis
-
setFixedSavings
public DateTimeZoneBuilder setFixedSavings(java.lang.String nameKey, int saveMillis)
Set a fixed savings rule at the cutover.
-
addRecurringSavings
public DateTimeZoneBuilder addRecurringSavings(java.lang.String nameKey, int saveMillis, int fromYear, int toYear, char mode, int monthOfYear, int dayOfMonth, int dayOfWeek, boolean advanceDayOfWeek, int millisOfDay)
Add a recurring daylight saving time rule.- Parameters:
nameKey
- the name key of new rulesaveMillis
- the milliseconds to add to standard offsetfromYear
- the first year that rule is in effect, MIN_VALUE indicates beginning of timetoYear
- the last year (inclusive) that rule is in effect, MAX_VALUE indicates end of timemode
- 'u' - transitions are calculated against UTC, 'w' - transitions are calculated against wall offset, 's' - transitions are calculated against standard offsetmonthOfYear
- the month from 1 (January) to 12 (December)dayOfMonth
- if negative, set to ((last day of month) - ~dayOfMonth). For example, if -1, set to last day of monthdayOfWeek
- from 1 (Monday) to 7 (Sunday), if 0 then ignoreadvanceDayOfWeek
- if dayOfMonth does not fall on dayOfWeek, advance to dayOfWeek when true, retreat when false.millisOfDay
- additional precision for specifying time of day of transitions
-
getLastRuleSet
private DateTimeZoneBuilder.RuleSet getLastRuleSet()
-
toDateTimeZone
public DateTimeZone toDateTimeZone(java.lang.String id, boolean outputID)
Processes all the rules and builds a DateTimeZone.- Parameters:
id
- time zone id to assignoutputID
- true if the zone id should be output
-
addTransition
private boolean addTransition(java.util.ArrayList<DateTimeZoneBuilder.Transition> transitions, DateTimeZoneBuilder.Transition tr)
-
writeTo
public void writeTo(java.lang.String zoneID, java.io.OutputStream out) throws java.io.IOException
Encodes a built DateTimeZone to the given stream. Call readFrom to decode the data into a DateTimeZone object.- Parameters:
out
- the output stream to receive the encoded DateTimeZone- Throws:
java.io.IOException
- Since:
- 1.5 (parameter added)
-
writeTo
public void writeTo(java.lang.String zoneID, java.io.DataOutput out) throws java.io.IOException
Encodes a built DateTimeZone to the given stream. Call readFrom to decode the data into a DateTimeZone object.- Parameters:
out
- the output stream to receive the encoded DateTimeZone- Throws:
java.io.IOException
- Since:
- 1.5 (parameter added)
-
-