java时区讲解

资源

代码地址:https://code.csdn.net/luo4105/javautilclass/tree/master下的TimeZoneTest.java文件。

时区简介

什么是时区

时区是人为划定的,以本初子午线中心(英国格林尼治天文台),将地球划为24个时区。时区向东加一区,时间调快一小时,时区向西加一区,时间调慢一小时。如北京为东八区,日本为东九区,北京时间比日本晚一小时。

时区分类

时区有0时区、东1-12区,西1-12区共24区,(这明明是25个区,莫非当年划分时区的英国人数学太差算错了?)。当然不是,实际上,东12区和西12区划为一个区,称东西12区,东12区占其中一半,西12区占其中一半,从东12区进入西12区,时间调慢1天。

时区的表达

GMT

GMT是即格林尼治平太阳时间,实际就是零时区的时间。用”GMT+偏移量”来表示时区。如“GMT+1”代表东一区,时间就是零时区时间加1小时;”GMT-1”就是西1区,时间就是零时区时间减1小时;我国位于东八区,就是”GMT+8”。

UTC

UTC是标准时间,也就是零时区的时间。

Java中的时区处理

JAVA关于时间的存储

Java存的是从1997/1/1 00:00:00到现在时间的毫秒数,按的是标准时间存储。如setDate(0)就是1997/1/1 00:00:00。但是获取时会加上时间的偏移量,我们是东八区,所以setDate(0)的显示是1997/1/1 08:00:00。

时区之间的转化处理

由于java中存的是标准时区的时间,只是获取时转成本地时区,所以我们只要对时间设置时区,就能获得对应时区的时间。

Java中的时区类:TimeZone

TimeZone是Java中处理时区的类。

获得本地时区

Calendar cal = Calendar.getInstance();
TimeZone timeZone = cal.getTimeZone();
System.out.println(timeZone.getID());
TimeZone timeZone1 = TimeZone.getDefault();
System.out.println(timeZone1.getID());
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
TimeZone timeZone2 = simpleDateFormat.getTimeZone();
System.out.println(timeZone2.getID());

打印

Asia/Shanghai

Asia/Shanghai

Asia/Shanghai

注意java和php时区中没有asia/beijing,只有asia/shanghai和asia/chongqing,这是民国时期划分的时区。曾经有程序员向sun提出这个问题,但sun不予采纳,认为不是bug。对此我认为应该添加asia/beijing,毕竟新中国以北京时间为标准时间,以示对中国的尊重。毕竟中国是个大国。

设置指定时区

TimeZone timeZone = TimeZone.getTimeZone("GMT+2");
System.out.println(timeZone.getID());
TimeZone timeZone1 = TimeZone.getTimeZone("Asia/Shanghai");
System.out.println(timeZone1.getID());

打印

GMT+02:00

Asia/Shanghai

给时间设置时区

Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT+2"));
cal.setTime(new Date());
System.out.println((cal.get(Calendar.MONTH) + 1) + "-" + cal.get(Calendar.DATE) + " " + cal.get(Calendar.HOUR_OF_DAY) + ":" + cal.get(Calendar.MINUTE));
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
simpleDateFormat.setTimeZone(TimeZone.getTimeZone("GMT+2"));
System.out.println(simpleDateFormat.format(new Date()));
System.out.println(DateFormatUtils.format(new Date(),"yyyy-MM-dd HH:mm:ss", TimeZone.getTimeZone("GMT+2")))

打印

8-29 5:36

2017-08-29 05:36:35

2017-08-29 05:36:35

获得时区偏移量

Calendar cal = Calendar.getInstance();
long offset = cal.get(Calendar.ZONE_OFFSET);
System.out.println(offset/60/60/1000);
TimeZone timeZone = TimeZone.getDefault();
long offset1 = timeZone.getOffset(Calendar.ZONE_OFFSET);
System.out.println(offset1/60/60/1000);

打印

8

8

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏xiaoxi666的专栏

权限控制框架

18030
来自专栏趣谈编程

Spring IOC 的本质

前言: Spring 这个轻量级的框架已经成为Web开发事实上的标准, 不少同学建议我写一些Spring相关的技术, 我刚开始是拒绝的, 因为现在网上相关的文章...

8020
来自专栏趣谈编程

小白科普:线程和线程池

第一个问题问题就是为什么要多线程啊, 我看了操作系统中的多进程管理,不是挺好的吗? 多线程似乎没有必要啊!

9120
来自专栏Java程序猿部落

SpringBoot 教程之属性加载详解

默认情况下, SpringApplication 会获取 -- 参数(例如 --server.port=9000 ),并将这个 property 添加到 Spr...

6620
来自专栏CWIKIUS

Spring AMQP 发送消息到 RabbitMQ 收到 x-queue-type 错误

在使用 Spring AMQP 发送消息到 RabbitMQ 的时候收到错误信息:

16620
来自专栏趣谈编程

“无状态”的那点事儿

我经常听师兄们争论‘无状态’, 说‘无状态’在软件编程中是好事情, 可是到底什么是状态? 什么是无状态?

6720
来自专栏泰斗贤若如

Java匹马行天下之教你用学汉语式方法学编程语言

我试着从不同的角度带新手理解编程,希望能帮助一些真正需要的朋友进行学习,后面的三篇故事新手朋友就当真正看故事了,等你学了后面的知识,你就能理解了,现在留个简单印...

10520
来自专栏Java架构沉思录

Skywalking是什么

Skywalking 是一个分布式追踪(Trace)系统。除了 Skywalking 之外,比较出名的分布式追踪系统还有 Dapper、鹰眼、Pinpoint ...

29140
来自专栏趣谈编程

一个故事读懂Java泛型

登基以后第一次早朝, 意气风发的第5代Java国王坐在宝座上,看着下面恭恭敬敬的各位大臣,心情大好。

9740
来自专栏趣谈编程

什么是桶排序?

计数排序需要根据原始数列的取值范围,创建一个统计数组,用来统计原始数列中每一个可能的整数值所出现的次数。

13620

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励