Class VTimeZone

  • All Implemented Interfaces:
    Freezable<TimeZone>, java.io.Serializable, java.lang.Cloneable

    public class VTimeZone
    extends BasicTimeZone
    VTimeZone is a class implementing RFC2445 VTIMEZONE. You can create a VTimeZone instance from a time zone ID supported by TimeZone. With the VTimeZone instance created from the ID, you can write out the rule in RFC2445 VTIMEZONE format. Also, you can create a VTimeZone instance from RFC2445 VTIMEZONE data stream, which allows you to calculate time zone offset by the rules defined by the data.

    Note: The consumer of this class reading or writing VTIMEZONE data is responsible to decode or encode Non-ASCII text. Methods reading/writing VTIMEZONE data in this class do nothing with MIME encoding.
    See Also:
    Serialized Form
    • Constructor Detail

      • VTimeZone

        private VTimeZone()
      • VTimeZone

        private VTimeZone​(java.lang.String tzid)
    • Method Detail

      • create

        public static VTimeZone create​(java.lang.String tzid)
        Create a VTimeZone instance by the time zone ID.
        Parameters:
        tzid - The time zone ID, such as America/New_York
        Returns:
        A VTimeZone initialized by the time zone ID, or null when the ID is unknown.
      • create

        public static VTimeZone create​(java.io.Reader reader)
        Create a VTimeZone instance by RFC2445 VTIMEZONE data.
        Parameters:
        reader - The Reader for VTIMEZONE data input stream
        Returns:
        A VTimeZone initialized by the VTIMEZONE data or null if failed to load the rule from the VTIMEZONE data.
      • getOffset

        public int getOffset​(int era,
                             int year,
                             int month,
                             int day,
                             int dayOfWeek,
                             int milliseconds)
        Gets the time zone offset, for current date, modified in case of daylight savings. This is the offset to add to UTC to get local time.
        Specified by:
        getOffset in class TimeZone
        Parameters:
        era - the era of the given date.
        year - the year in the given date.
        month - the month in the given date. Month is 0-based. e.g., 0 for January.
        day - the day-in-month of the given date.
        dayOfWeek - the day-of-week of the given date.
        milliseconds - the millis in day in standard local time.
        Returns:
        the offset to add to GMT to get local time.
      • getOffset

        public void getOffset​(long date,
                              boolean local,
                              int[] offsets)
        Returns the time zone raw and GMT offset for the given moment in time. Upon return, local-millis = GMT-millis + rawOffset + dstOffset. All computations are performed in the proleptic Gregorian calendar. The default implementation in the TimeZone class delegates to the 8-argument getOffset().
        Overrides:
        getOffset in class TimeZone
        Parameters:
        date - moment in time for which to return offsets, in units of milliseconds from January 1, 1970 0:00 GMT, either GMT time or local wall time, depending on local.
        local - if true, date is local wall time; otherwise it is in GMT time.
        offsets - output parameter to receive the raw offset, that is, the offset not including DST adjustments, in offsets[0], and the DST offset, that is, the offset to be added to rawOffset to obtain the total offset between local and GMT time, in offsets[1]. If DST is not in effect, the DST offset is zero; otherwise it is a positive value, typically one hour.
      • getRawOffset

        public int getRawOffset()
        Gets unmodified offset, NOT modified in case of daylight savings. This is the offset to add to UTC to get local time.
        Specified by:
        getRawOffset in class TimeZone
        Returns:
        the unmodified offset to add to UTC to get local time.
      • inDaylightTime

        public boolean inDaylightTime​(java.util.Date date)
        Queries if the given date is in daylight savings time in this time zone.
        Specified by:
        inDaylightTime in class TimeZone
        Parameters:
        date - the given Date.
        Returns:
        true if the given date is in daylight savings time, false, otherwise.
      • setRawOffset

        public void setRawOffset​(int offsetMillis)
        Sets the base time zone offset to GMT. This is the offset to add to UTC to get local time.
        Specified by:
        setRawOffset in class TimeZone
        Parameters:
        offsetMillis - the given base time zone offset to GMT.
      • useDaylightTime

        public boolean useDaylightTime()
        Queries if this time zone uses daylight savings time.
        Specified by:
        useDaylightTime in class TimeZone
        Returns:
        true if this time zone uses daylight savings time, false, otherwise.

        Note:The default implementation of ICU TimeZone uses the tz database, which supports historic rule changes, for system time zones. With the implementation, there are time zones that used daylight savings time in the past, but no longer used currently. For example, Asia/Tokyo has never used daylight savings time since 1951. Most clients would expect that this method to return false for such case. The default implementation of this method returns true when the time zone uses daylight savings time in the current (Gregorian) calendar year.

      • observesDaylightTime

        public boolean observesDaylightTime()
        Queries if this time zone is in daylight saving time or will observe daylight saving time at any future time.

        The default implementation in this class returns true if TimeZone.useDaylightTime() or inDaylightTime(new Date()) returns true.

        Note: This method was added for TimeZone compatibility support. The TimeZone.useDaylightTime() method only checks the last known rule(s), therefore it may return false even the zone observes daylight saving time currently. TimeZone added observesDaylightTime() to resolve the issue. In ICU, TimeZone.useDaylightTime() works differently. The ICU implementation checks if the zone uses daylight saving time in the current calendar year. Therefore, it will never return false if daylight saving time is currently used.

        ICU's TimeZone subclass implementations override this method to support the same behavior with TimeZone.observesDaylightTime(). Unlike TimeZone.useDaylightTime(), the implementation does not take past daylight saving time into account, so that this method may return false even when TimeZone.useDaylightTime() returns true.

        Overrides:
        observesDaylightTime in class TimeZone
        Returns:
        true if this time zone is in daylight saving time or will observe daylight saving time at any future time.
        See Also:
        TimeZone.useDaylightTime()
      • hasSameRules

        public boolean hasSameRules​(TimeZone other)
        Returns true if this zone has the same rule and offset as another zone. That is, if this zone differs only in ID, if at all. Returns false if the other zone is null.
        Overrides:
        hasSameRules in class TimeZone
        Parameters:
        other - the TimeZone object to be compared with
        Returns:
        true if the other zone is not null and is the same as this one, with the possible exception of the ID
      • getTZURL

        public java.lang.String getTZURL()
        Gets the RFC2445 TZURL property value. When a VTimeZone instance was created from VTIMEZONE data, the value is set by the TZURL property value in the data. Otherwise, the initial value is null.
        Returns:
        The RFC2445 TZURL property value
      • setTZURL

        public void setTZURL​(java.lang.String url)
        Sets the RFC2445 TZURL property value.
        Parameters:
        url - The TZURL property value.
      • getLastModified

        public java.util.Date getLastModified()
        Gets the RFC2445 LAST-MODIFIED property value. When a VTimeZone instance was created from VTIMEZONE data, the value is set by the LAST-MODIFIED property value in the data. Otherwise, the initial value is null.
        Returns:
        The Date represents the RFC2445 LAST-MODIFIED date.
      • setLastModified

        public void setLastModified​(java.util.Date date)
        Sets the date used for RFC2445 LAST-MODIFIED property value.
        Parameters:
        date - The Date object represents the date for RFC2445 LAST-MODIFIED property value.
      • write

        public void write​(java.io.Writer writer)
                   throws java.io.IOException
        Writes RFC2445 VTIMEZONE data for this time zone
        Parameters:
        writer - A Writer used for the output
        Throws:
        java.io.IOException - If there were problems creating a buffered writer or writing to it.
      • write

        public void write​(java.io.Writer writer,
                          long start)
                   throws java.io.IOException
        Writes RFC2445 VTIMEZONE data applicable for dates after the specified start time.
        Parameters:
        writer - The Writer used for the output
        start - The start time
        Throws:
        java.io.IOException - If there were problems reading and writing to the writer.
      • writeSimple

        public void writeSimple​(java.io.Writer writer,
                                long time)
                         throws java.io.IOException
        Writes RFC2445 VTIMEZONE data applicable near the specified date. Some common iCalendar implementations can only handle a single time zone property or a pair of standard and daylight time properties using BYDAY rule with day of week (such as BYDAY=1SUN). This method produce the VTIMEZONE data which can be handled these implementations. The rules produced by this method can be used only for calculating time zone offset around the specified date.
        Parameters:
        writer - The Writer used for the output
        time - The date
        Throws:
        java.io.IOException - If there were problems reading or writing to the writer.
      • getNextTransition

        public TimeZoneTransition getNextTransition​(long base,
                                                    boolean inclusive)
        Returns the first time zone transition after the base time.

        Example code:{@.jcite com.ibm.icu.samples.util.timezone.BasicTimeZoneExample:---getNextTransitionExample}

        Specified by:
        getNextTransition in class BasicTimeZone
        Parameters:
        base - The base time.
        inclusive - Whether the base time is inclusive or not.
        Returns:
        A Date holding the first time zone transition time after the given base time, or null if no time zone transitions are available after the base time.
      • getPreviousTransition

        public TimeZoneTransition getPreviousTransition​(long base,
                                                        boolean inclusive)
        Returns the last time zone transition before the base time.

        Example code:{@.jcite com.ibm.icu.samples.util.timezone.BasicTimeZoneExample:---getPreviousTransitionExample}

        Specified by:
        getPreviousTransition in class BasicTimeZone
        Parameters:
        base - The base time.
        inclusive - Whether the base time is inclusive or not.
        Returns:
        A Date holding the last time zone transition time before the given base time, or null if no time zone transitions are available before the base time.
      • hasEquivalentTransitions

        public boolean hasEquivalentTransitions​(TimeZone other,
                                                long start,
                                                long end)
        Checks if the time zone has equivalent transitions in the time range. This method returns true when all of transition times, from/to standard offsets and DST savings used by this time zone match the other in the time range.

        Example code:{@.jcite com.ibm.icu.samples.util.timezone.BasicTimeZoneExample:---hasEquivalentTransitionsExample}

        Overrides:
        hasEquivalentTransitions in class BasicTimeZone
        Parameters:
        other - The instance of TimeZone
        start - The start time of the evaluated time range (inclusive)
        end - The end time of the evaluated time range (inclusive)
        Returns:
        true if the other time zone has the equivalent transitions in the time range. When tz is not a BasicTimeZone, this method returns false.
      • getTimeZoneRules

        public TimeZoneRule[] getTimeZoneRules()
        Returns the array of TimeZoneRule which represents the rule of this time zone object. The first element in the result array will be the InitialTimeZoneRule instance for the initial rule. The rest will be either AnnualTimeZoneRule or TimeArrayTimeZoneRule instances representing transitions.
        Specified by:
        getTimeZoneRules in class BasicTimeZone
        Returns:
        The array of TimeZoneRule which represents this time zone.
      • getTimeZoneRules

        public TimeZoneRule[] getTimeZoneRules​(long start)
        Returns the array of TimeZoneRule which represents the rule of this time zone object since the specified start time. The first element in the result array will be the InitialTimeZoneRule instance for the initial rule. The rest will be either AnnualTimeZoneRule or TimeArrayTimeZoneRule instances representing transitions.

        Example code:{@.jcite com.ibm.icu.samples.util.timezone.BasicTimeZoneExample:---getTimeZoneRulesExample}

        Overrides:
        getTimeZoneRules in class BasicTimeZone
        Parameters:
        start - The start time (inclusive).
        Returns:
        The array of TimeZoneRule which represents this time zone since the start time.
      • clone

        public java.lang.Object clone()
        Overrides clone.
        Overrides:
        clone in class TimeZone
      • load

        private boolean load​(java.io.Reader reader)
      • parse

        private boolean parse()
      • getDefaultTZName

        private static java.lang.String getDefaultTZName​(java.lang.String tzid,
                                                         boolean isDST)
      • createRuleByRRULE

        private static TimeZoneRule createRuleByRRULE​(java.lang.String tzname,
                                                      int rawOffset,
                                                      int dstSavings,
                                                      long start,
                                                      java.util.List<java.lang.String> dates,
                                                      int fromOffset)
      • parseRRULE

        private static int[] parseRRULE​(java.lang.String rrule,
                                        long[] until)
      • createRuleByRDATE

        private static TimeZoneRule createRuleByRDATE​(java.lang.String tzname,
                                                      int rawOffset,
                                                      int dstSavings,
                                                      long start,
                                                      java.util.List<java.lang.String> dates,
                                                      int fromOffset)
      • writeZone

        private void writeZone​(java.io.Writer w,
                               BasicTimeZone basictz,
                               java.lang.String[] customProperties)
                        throws java.io.IOException
        Throws:
        java.io.IOException
      • isEquivalentDateRule

        private static boolean isEquivalentDateRule​(int month,
                                                    int weekInMonth,
                                                    int dayOfWeek,
                                                    DateTimeRule dtrule)
      • writeZonePropsByTime

        private static void writeZonePropsByTime​(java.io.Writer writer,
                                                 boolean isDst,
                                                 java.lang.String tzname,
                                                 int fromOffset,
                                                 int toOffset,
                                                 long time,
                                                 boolean withRDATE)
                                          throws java.io.IOException
        Throws:
        java.io.IOException
      • writeZonePropsByDOM

        private static void writeZonePropsByDOM​(java.io.Writer writer,
                                                boolean isDst,
                                                java.lang.String tzname,
                                                int fromOffset,
                                                int toOffset,
                                                int month,
                                                int dayOfMonth,
                                                long startTime,
                                                long untilTime)
                                         throws java.io.IOException
        Throws:
        java.io.IOException
      • writeZonePropsByDOW

        private static void writeZonePropsByDOW​(java.io.Writer writer,
                                                boolean isDst,
                                                java.lang.String tzname,
                                                int fromOffset,
                                                int toOffset,
                                                int month,
                                                int weekInMonth,
                                                int dayOfWeek,
                                                long startTime,
                                                long untilTime)
                                         throws java.io.IOException
        Throws:
        java.io.IOException
      • writeZonePropsByDOW_GEQ_DOM

        private static void writeZonePropsByDOW_GEQ_DOM​(java.io.Writer writer,
                                                        boolean isDst,
                                                        java.lang.String tzname,
                                                        int fromOffset,
                                                        int toOffset,
                                                        int month,
                                                        int dayOfMonth,
                                                        int dayOfWeek,
                                                        long startTime,
                                                        long untilTime)
                                                 throws java.io.IOException
        Throws:
        java.io.IOException
      • writeZonePropsByDOW_GEQ_DOM_sub

        private static void writeZonePropsByDOW_GEQ_DOM_sub​(java.io.Writer writer,
                                                            int month,
                                                            int dayOfMonth,
                                                            int dayOfWeek,
                                                            int numDays,
                                                            long untilTime,
                                                            int fromOffset)
                                                     throws java.io.IOException
        Throws:
        java.io.IOException
      • writeZonePropsByDOW_LEQ_DOM

        private static void writeZonePropsByDOW_LEQ_DOM​(java.io.Writer writer,
                                                        boolean isDst,
                                                        java.lang.String tzname,
                                                        int fromOffset,
                                                        int toOffset,
                                                        int month,
                                                        int dayOfMonth,
                                                        int dayOfWeek,
                                                        long startTime,
                                                        long untilTime)
                                                 throws java.io.IOException
        Throws:
        java.io.IOException
      • writeFinalRule

        private static void writeFinalRule​(java.io.Writer writer,
                                           boolean isDst,
                                           AnnualTimeZoneRule rule,
                                           int fromRawOffset,
                                           int fromDSTSavings,
                                           long startTime)
                                    throws java.io.IOException
        Throws:
        java.io.IOException
      • beginZoneProps

        private static void beginZoneProps​(java.io.Writer writer,
                                           boolean isDst,
                                           java.lang.String tzname,
                                           int fromOffset,
                                           int toOffset,
                                           long startTime)
                                    throws java.io.IOException
        Throws:
        java.io.IOException
      • endZoneProps

        private static void endZoneProps​(java.io.Writer writer,
                                         boolean isDst)
                                  throws java.io.IOException
        Throws:
        java.io.IOException
      • beginRRULE

        private static void beginRRULE​(java.io.Writer writer,
                                       int month)
                                throws java.io.IOException
        Throws:
        java.io.IOException
      • appendUNTIL

        private static void appendUNTIL​(java.io.Writer writer,
                                        java.lang.String until)
                                 throws java.io.IOException
        Throws:
        java.io.IOException
      • writeHeader

        private void writeHeader​(java.io.Writer writer)
                          throws java.io.IOException
        Throws:
        java.io.IOException
      • writeFooter

        private static void writeFooter​(java.io.Writer writer)
                                 throws java.io.IOException
        Throws:
        java.io.IOException
      • getDateTimeString

        private static java.lang.String getDateTimeString​(long time)
      • getUTCDateTimeString

        private static java.lang.String getUTCDateTimeString​(long time)
      • parseDateTimeString

        private static long parseDateTimeString​(java.lang.String str,
                                                int offset)
      • offsetStrToMillis

        private static int offsetStrToMillis​(java.lang.String str)
      • millisToOffset

        private static java.lang.String millisToOffset​(int millis)
      • numToString

        private static java.lang.String numToString​(int num,
                                                    int width)