timezone.java

来自「这是一个手机上的J2ME程序」· Java 代码 · 共 188 行

JAVA
188
字号
// J2ME Compass
// Copyright (C) 2007 Dana Peters
// http://www.qcontinuum.org/compass

package org.qcontinuum.compass;

import java.io.*;
import java.util.*;

// Each entry in the TimeZone database consists of:
//
// Timezone name
// GMT offset (minutes)
// DST offset (minutes, 0=no DST)
// DST start month (0=no DST, 1-12=month)
// DST start week (0=no DST, 1-4=week, 5=last week)
// DST start day-of-week (0=Sunday, 1-5=Monday-Friday, 6=Saturday)
// DST start hour (0-23)
// DST end month (0=no DST, 1-12=month)
// DST end week (0=no DST, 1-4=week, 5=last week)
// DST end day-of-week (0=Sunday, 1-5=Monday-Friday, 6=Saturday)
// DST end hour (0-23)

public class TimeZone {

    private String mName;
    private int mGmtOffset;
    private int mDstOffset;
    private int mDstStartMonth;
    private int mDstStartWeek;
    private int mDstStartDow;
    private int mDstStartHour;
    private int mDstEndMonth;
    private int mDstEndWeek;
    private int mDstEndDow;
    private int mDstEndHour;

    public TimeZone() { }
    
    public TimeZone(TimeZone timeZone) {
        mName = timeZone.mName;
        mGmtOffset = timeZone.mGmtOffset;
        mDstOffset = timeZone.mDstOffset;
        mDstStartMonth = timeZone.mDstStartMonth;
        mDstStartWeek = timeZone.mDstStartWeek;
        mDstStartDow = timeZone.mDstStartDow;
        mDstStartHour = timeZone.mDstStartHour;
        mDstEndMonth = timeZone.mDstEndMonth;
        mDstEndWeek = timeZone.mDstEndWeek;
        mDstEndDow = timeZone.mDstEndDow;
        mDstEndHour = timeZone.mDstEndHour;
    }
    
    public TimeZone(DataInputStream inputStream) throws IOException {
        load(inputStream);
    }

    private void load(DataInputStream inputStream) throws IOException {
        mName = restoreNull(inputStream.readUTF());
        mGmtOffset = inputStream.readShort();
        mDstOffset = inputStream.readShort();
        mDstStartMonth = inputStream.readByte();
        mDstStartWeek = inputStream.readByte();
        mDstStartDow = inputStream.readByte();
        mDstStartHour = inputStream.readByte();
        mDstEndMonth = inputStream.readByte();
        mDstEndWeek = inputStream.readByte();
        mDstEndDow = inputStream.readByte();
        mDstEndHour = inputStream.readByte();
    }
    
    public void save(DataOutputStream outputStream) throws IOException {
        outputStream.writeUTF(removeNull(mName));
        outputStream.writeShort(mGmtOffset);
        outputStream.writeShort(mDstOffset);
        outputStream.writeByte(mDstStartMonth);
        outputStream.writeByte(mDstStartWeek);
        outputStream.writeByte(mDstStartDow);
        outputStream.writeByte(mDstStartHour);
        outputStream.writeByte(mDstEndMonth);
        outputStream.writeByte(mDstEndWeek);
        outputStream.writeByte(mDstEndDow);
        outputStream.writeByte(mDstEndHour);
    }
    
    public static Vector getZones(Object obj, int gmtOffset) {

        InputStream inputStream = obj.getClass().getResourceAsStream("TimeZone.dat");
        DataInputStream dataInputStream = new DataInputStream(inputStream);
        Vector zones = new Vector();
        try {
            while (true) {
                TimeZone timeZone = new TimeZone(dataInputStream);
                if (Math.abs(gmtOffset - timeZone.mGmtOffset) <= 90) {
                    zones.addElement(timeZone);
                }
            }
        }
        catch (IOException exception) { }
        finally {
            try {
                dataInputStream.close();
            } catch (Exception exception) { }
        }
        return zones;
    }

    public String getName() {
        return mName;
    }
    
    public int getStdOffset() {
        return mGmtOffset;
    }

    public int getDstOffset(Date localDate, boolean dstEnabled) {
        return mGmtOffset + (dstEnabled && inDst(localDate) ? mDstOffset : 0);
    }

    public Date getGmt(Date localDate, boolean dstEnabled) {
        return new Date(localDate.getTime() + getDstOffset(localDate, dstEnabled) * 60000L);
    }

    public Date getLocalTime(Date gmtDate, boolean dstEnabled) {
        Date approximateLocalTime = new Date(gmtDate.getTime() + mGmtOffset * 60000L);
        return new Date(gmtDate.getTime() - getDstOffset(approximateLocalTime, dstEnabled) * 60000L);
    }
    
    public boolean inDst(Date date) {
        if (mDstStartMonth == 0 || mDstEndMonth == 0)
            return false;
        long time = date.getTime();
        long start = getDstDate(date, mDstStartMonth, mDstStartWeek, mDstStartDow, mDstStartHour).getTime();
        long end = getDstDate(date, mDstEndMonth, mDstEndWeek, mDstEndDow, mDstEndHour).getTime();
        return (start < end ? (time > start && time < end) : (time > start || time < end));
    }

    public Date getDstStart(Date date) {
        if (mDstStartMonth == 0)
            return null;
        else
            return getDstDate(date, mDstStartMonth, mDstStartWeek, mDstStartDow, mDstStartHour);
    }
    
    public Date getDstEnd(Date date) {
        if (mDstEndMonth == 0)
            return null;
        else
            return getDstDate(date, mDstEndMonth, mDstEndWeek, mDstEndDow, mDstEndHour);
    }

    private Date getDstDate(Date year, int dstMonth, int dstWeek, int dstDow, int dstHour) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(year);
        cal.set(Calendar.MONTH, dstMonth - 1);
        cal.set(Calendar.DAY_OF_MONTH, 1);
        cal.set(Calendar.HOUR_OF_DAY, 0);
        cal.set(Calendar.MINUTE, 0);
        cal.set(Calendar.SECOND, 0);
        Date date = cal.getTime();
        int dow = cal.get(Calendar.DAY_OF_WEEK) - 1;
        int daysOffset = dstDow - dow;
        if (daysOffset < 0)
            daysOffset += 7;
        if (dstWeek < 5)
            daysOffset += (dstWeek - 1) * 7;
        else
            daysOffset += 21;
        date = new Date(date.getTime() + (daysOffset * 24 + dstHour) * 3600000L);
        if (dstWeek == 5) {
            Date oneMoreWeek = new Date(date.getTime() + 7 * 24 * 3600000L);
            cal.setTime(oneMoreWeek);
            if (cal.get(Calendar.MONTH) == dstMonth - 1)
                date = oneMoreWeek;
        }
        return date;
    }

    private String removeNull(String text) {
        return text != null ? text : "";
    }
    
    private String restoreNull(String text) {
        return text.length() > 0 ? text : null;
    }

}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?