时区&夏时令

时区

时区是什么?

时区即由于世界各国家与地区经度不同,地方时也有所不同,按照经度将全球划分为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);
发布了51 篇原创文章 · 获赞 0 · 访问量 741

猜你喜欢

转载自blog.csdn.net/lxy1740/article/details/104307100