时区
时区是什么?
时区即由于世界各国家与地区经度不同,地方时也有所不同,按照经度将全球划分为24个时区。
时区有相应的英文字母缩写,例如GMT,UTC,CST等,常见的时区,具体参考:这里。
时区的基本概念
GMT(Greenwich Mean Time)
即格林威治标准时,是东西经零度的地方。人们将地球人为的分为24等份,每一等份为一个时区,每时区横跨经度15度,时间正好为1小时。往西一个时区,则减去一小时;往东一个时区,则加上一小时。中国在东经120度上,(东经120°-东经0°)所得度数再除以15,即得8。
UTC(Coordinated Universal Time)
即世界协调时间,是经过平均太阳时(以格林威治时间GMT为准)、地轴运动修正后的新时标以及以「秒」为单位的国际原子时所综合精算而成的时间,计算过程相当严谨精密,因此若以「世界标准时间」的角度来说,UTC比GMT来得更加精准。UTC的本质强调的是比GMT更为精确的世界时间标准,不过对于现行表款来说,GMT与UTC的功能与精确度是没有差别的。
CST时间却同时可以代表如下 4 个不同的时区:
Central Standard Time (USA) UT-6:00
Central Standard Time (Australia) UT+9:30
China Standard Time UT+8:00
Cuba Standard Time UT-4:00
可见,CST可以同时表示美国,澳大利亚,中国,古巴四个国家的标准时间。
DST(Daylight Saving Time)
夏日节约时间,指在夏天太阳升起的比较早时,将时钟拨快一小时,以提早日光的使用,在英国则称为夏令时间(Summer Time)。
PDT以及PST, PDT 是 Pacific Daylight Time 的缩写。
美国夏季始于每年4月的第1个周日,止于每年10月的最后一个周日。夏令时比正常时间早一小时,与PDT时间相对应的是PST , Pacific Standard Time 。 夏时制结束后就是PST(太平洋标准时间),西八区,与北京时间(东八区)时差-16个小时。
java中的时区
可以用以下code,列出java中的时区
String ids[] = TimeZone.getAvailableIDs();
for(String id: ids) {
System.out.println(id);
}
时区计算
依据UTC/GMT时区,如东八区=8,西五区=-5,计算TimeZone,获取某个时区的时间需要输入TimeZone。
public TimeZone getTimeZone(int timeZoneOffset) {
if (timeZoneOffset > 14 || timeZoneOffset < -12) {
System.out.println("Configuration item TimeZone " + timeZoneOffset + " is invalid.");
timeZoneOffset = 0;
}
TimeZone timeZone;
String[] ids = TimeZone.getAvailableIDs(timeZoneOffset * 60 * 60 * 1000);
if (ids.length == 0) {
// Use default TimeZone
timeZone = TimeZone.getDefault();
} else {
timeZone = new SimpleTimeZone(timeZoneOffset * 60 * 60 * 1000, ids[0]);
}
return timeZone;
}
获取某个时区的时间
//这是获取当前设备ip所在时区的时间
Calendar calendar = Calendar.getInstance(TimeZone.getDefault());
//获取东八区的时间
TimeZone timeZone = getTimeZone(8);
Calendar calendar = Calendar.getInstance(timeZone);
两个时区之间的转换
public MyDate dateTransBetweenTimeZone(Date sourceDate, TimeZone sourceTimeZone, TimeZone targetTimeZone) {
int timeOffSet = sourceTimeZone.getOffset(sourceDate.getTime()) - targetTimeZone.getOffset(sourceDate.getTime());
Long targetTime = sourceDate.getTime() - (long) timeOffSet;
Date date = new Date(targetTime);
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
return getMyDate(calendar);
}
当输入以下参数即可将当前时间调整为GMT时间
Date sourceDate = calendar.getTime();
TimeZone sourceTimeZone = TimeZone.getTimeZone("GMT");
TimeZone targetTimeZone = TimeZone.getDefault();
当输入以下参数,可将当前所在时区时间调整为某一时区时间
Date sourceDate = calendar.getTime();
TimeZone sourceTimeZone = TimeZone.getDefault();
TimeZone targetTimeZone = getTimeZone(-1);//将当前时区时间转换为西一区时间
夏时令
夏令时的定义
夏时制,夏时令(DaylightSaving Time:DST),又称“日光节约时制”和“夏令时间”,是一种为节约能源而人为规定地方时间的制度,在这一制度实行期间所采用的统一时间称为“夏令时间”。一般在天亮早的夏季人为将时间提前一小时,可以使人早起早睡,减少照明量,以充分利用光照资源,从而节约照明用电。各个采纳夏时制的国家具体规定不同。目前全世界有近110个国家每年要实行夏令时。
夏令时为一个时间段,一般在进入时刻将时钟调快一小时(例如2:00调为3:00),在退出时刻将时钟调慢一小时(例如3:00调为2:00)。
夏令时管理
如果要用PDT,用PST作为时区可以得到准确的时间,即使是夏令时
TimeZone timeZone = TimeZone.getTimeZone("PST");
Calendar calendar = new GregorianCalendar();
calendar.set(Calendar.MILLISECOND, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.HOUR, 0);
calendar.set(2018, 5, 10);// 输出 Sat Mar 10 16:00:00 CST 2018
calendar.setTimeZone(timeZone);
System.out.println(calendar.getTime());
验证某个时区是否使用夏时令
boolean isUsingDST = TimeZone.getTimeZone("America/Los_Angeles").useDaylightTime();
System.out.println(isUsingDST);
验证某个时区在某时间内是否使用夏时令
Calendar calendarServer=Calendar.getInstance();
calendarServer.add(Calendar.DATE, 1);
boolean isUsingDST = clientTimeZone.inDaylightTime(calendarServer.getTime());
System.out.println(isUsingDST);