001/*
002 *  Copyright 2001-2005 Stephen Colebourne
003 *
004 *  Licensed under the Apache License, Version 2.0 (the "License");
005 *  you may not use this file except in compliance with the License.
006 *  You may obtain a copy of the License at
007 *
008 *      http://www.apache.org/licenses/LICENSE-2.0
009 *
010 *  Unless required by applicable law or agreed to in writing, software
011 *  distributed under the License is distributed on an "AS IS" BASIS,
012 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 *  See the License for the specific language governing permissions and
014 *  limitations under the License.
015 */
016package org.joda.time.tz;
017
018import org.joda.time.DateTimeZone;
019
020/**
021 * Basic DateTimeZone implementation that has a fixed name key and offsets.
022 * <p>
023 * FixedDateTimeZone is thread-safe and immutable.
024 * 
025 * @author Brian S O'Neill
026 * @since 1.0
027 */
028public final class FixedDateTimeZone extends DateTimeZone {
029
030    private static final long serialVersionUID = -3513011772763289092L;
031
032    private final String iNameKey;
033    private final int iWallOffset;
034    private final int iStandardOffset;
035
036    public FixedDateTimeZone(String id, String nameKey,
037                             int wallOffset, int standardOffset) {
038        super(id);
039        iNameKey = nameKey;
040        iWallOffset = wallOffset;
041        iStandardOffset = standardOffset;
042    }
043
044    public String getNameKey(long instant) {
045        return iNameKey;
046    }
047
048    public int getOffset(long instant) {
049        return iWallOffset;
050    }
051
052    public int getStandardOffset(long instant) {
053        return iStandardOffset;
054    }
055
056    public int getOffsetFromLocal(long instantLocal) {
057        return iWallOffset;
058    }
059
060    public boolean isFixed() {
061        return true;
062    }
063
064    public long nextTransition(long instant) {
065        return instant;
066    }
067
068    public long previousTransition(long instant) {
069        return instant;
070    }
071
072    /**
073     * Override to return the correct timzone instance.
074     * @since 1.5
075     */
076    public java.util.TimeZone toTimeZone() {
077        String id = getID();
078        if (id.length() == 6 && (id.startsWith("+") || id.startsWith("-"))) {
079            // standard format offset [+-]hh:mm
080            // our ID is without any prefix, so we need to add the GMT back
081            return java.util.TimeZone.getTimeZone("GMT" + getID());
082        }
083        // unusual offset, so setup a SimpleTimeZone as best we can
084        return new java.util.SimpleTimeZone(iWallOffset, getID());
085    }
086
087    public boolean equals(Object obj) {
088        if (this == obj) {
089            return true;
090        }
091        if (obj instanceof FixedDateTimeZone) {
092            FixedDateTimeZone other = (FixedDateTimeZone) obj;
093            return
094                getID().equals(other.getID()) &&
095                iStandardOffset == other.iStandardOffset &&
096                iWallOffset == other.iWallOffset;
097        }
098        return false;
099    }
100
101    public int hashCode() {
102        return getID().hashCode() + 37 * iStandardOffset + 31 * iWallOffset;
103    }
104
105}