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 + -
显示快捷键?