资讯专栏INFORMATION COLUMN

java时区理解

Amio / 3029人阅读

摘要:一时区的基本概念,即格林威治标准时,是东西经零度的地方。时间却同时可以代表如下个不同的时区可见,可以同时表示美国,澳大利亚,中国,古巴四个国家的标准时间。以及是的缩写,美国夏季始于每年月的第个周日,止于每年月的最后一个周日。

一、时区的基本概念
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);
        }

注意:你会发现在PDT不在该时区列表里
如果要用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);// 输出 Sun Jun 10 15:00:00 CST 2018
                //calendar.set(2018, 2, 10); // 输出 Sat Mar 10 16:00:00 CST 2018
        calendar.setTimeZone(timeZone);
        System.out.println(calendar.getTime());

如果要获得某个时区是否使用了DST,可以用useDaylightTime

        boolean isUsingDST = TimeZone.getTimeZone("America/Los_Angeles").useDaylightTime();
        System.out.println(isUsingDST);

如果要判断某个时间在某个时区是否发生了DST,可以用

               Calendar calendarServer=Calendar.getInstance();
        calendarServer.add(Calendar.DATE, 1);
        boolean isUsingDST = clientTimeZone.inDaylightTime(calendarServer.getTime());
        System.out.println(isUsingDST);

获取当前时区和UTC的偏移量,在当前时间5月13日(发生了DLS)比较getRawOffset() 和getOffset()

                TimeZone.setDefault(TimeZone.getTimeZone("America/Los_Angeles"));//将timezone设定到发生夏令时的地区
                int rowOffSet = TimeZone.getDefault().getRawOffset();
        int offSet = TimeZone.getDefault().getOffset(System.currentTimeMillis());
                System.out.println(offSet + " " + offSet/3600000 ); // -7 hours
        System.out.println(rowOffSet + " " + rowOffSet/3600000); // -8 hours

以下是时区转化的例子

        Date date = new Date(1359641834000L);// 2013-1-31 22:17:14
        String dateStr = "2013-3-31 22:17:14";
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        dateFormat.setTimeZone(TimeZone.getTimeZone("CST"));// CST = GMT - 6(Central Standard Time (USA)而不是北京标准时间)

        try {
//            指该字串以CST来换算,所以实际时间是2013-1-31 22:17:14 CST(GMT - 6),输出是以host的时区(GMT+8)进行format,所以加14
            Date dateTmp = dateFormat.parse(dateStr);

                        boolean isUsingDST = TimeZone.getTimeZone("CST").inDaylightTime(dateTmp);
            System.out.println(isUsingDST);// 输出true,因此减1个小时
            System.out.println(dateTmp);//输出 Fri Feb 01 11:17:14 CST 2013
        } catch(ParseException e) {
            e.printStackTrace();
        }
        String dateStrTmp = dateFormat.format(date);//数字是绝对时间,如果以host时区(GMT+8)来format就是22:17,这个数字以CST/GMT-6时区来format,就是-14
        System.out.println(dateStrTmp);// 输出 2013-01-31 08:17:14

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/69371.html

相关文章

  • Java™ 教程(Date-Time)

    Date-Time Java SE 8发行版中引入的Date-Time包java.time提供了全面的日期和时间模型,是在JSR 310:Date and Time API下开发的,尽管java.time基于国际标准化组织(ISO)日历系统,但也支持常用的全球日历。 此课程介绍了使用基于ISO的类来表示日期和时间以及操作日期和时间值的基本原理。 概述 时间似乎是一个简单的主题,即便是便宜的手表也能...

    AlphaGooo 评论0 收藏0
  • Java8实战》-第十二章笔记(新的日期和时间API)

    摘要:合并日期和时间这个复合类名叫,是和的合体。截至目前,我们介绍的这些日期时间对象都是不可修改的,这是为了更好地支持函数式编程,确保线程安全,保持领域模式一致性而做出的重大设计决定。 新的日期和时间API Java的API提供了很多有用的组件,能帮助你构建复杂的应用。不过,Java API也不总是完美的。我们相信大多数有经验的程序员都会赞同Java 8之前的库对日期和时间的支持就非常不理想...

    khlbat 评论0 收藏0
  • Java 时间与日期处理

    摘要:时间与日期处理从属于笔者的现代开发系列文章,涉及到的引用资料声明在学习与实践资料索引中。可以通过静态构造方法很容易的创建,定义了与之间的转化关系时差类以年月日来表示日期差,而以秒与毫秒来表示时间差适用于处理与机器时间。 Java 时间与日期处理 从属于笔者的现代 Java 开发系列文章,涉及到的引用资料声明在 Java 学习与实践资料索引中。 Java 时间与日期处理 在 Java 8...

    HelKyle 评论0 收藏0
  • 20 个案例教你在 Java 8 中如何处理日期和时间?

    摘要:前言前面一篇文章写了如何安全的使用里面介绍了如何处理日期时间,以及如何保证线程安全,及其介绍了在中的处理时间日期默认就线程安全的类。引入了全新的日期时间格式工具,线程安全而且使用方便。 前言 前面一篇文章写了《SimpleDateFormat 如何安全的使用?》, 里面介绍了 SimpleDateFormat 如何处理日期/时间,以及如何保证线程安全,及其介绍了在 Java 8 中的处...

    Rango 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<