前言

在Java8以前,我们对于时区的处理通常是为时间转换类设置指定TimeZone,然后进行时区时间转换。

而在Java8中不仅对时间日期进行了细粒度处理,有无时区,时区处理也进行了更加细粒度的优化。

在之前我们介绍的新类库中基本都是无时区概念的。本文将引入时区概念。

概念

介绍时区相关类库前,先来认识下Java中常见的几种时间格式

1.世界标准时间(UTC时间),其中T表示时分秒的开始,结尾的Z表示这是一个世界标准时间

2020-07-06T11:24:37.081Z

2.本地时间(不含时区信息的时间),结尾无时区信息

2020-07-06T19:24:37.156

3.含有时区信息的时间,+08:00表示该时间是由UTC时间加上8小时得到的,[Asia/Shanghai]表示该时间的时区信息

2020-07-06T19:24:37.156+08:00[Asia/Shanghai]

ZoneId和ZoneOffSet

  • ZoneId表示一个时区实例,他的内部定义了一个地区的时区规则集,例如Europe/Paris
  • ZoneOffSet表示与UTC时间的偏移时间,格式为+08:00-04:00

创建ZoneId

//获取系统默认时区
System.out.println(ZoneId.systemDefault());
//4种常用方式创建ZoneId
System.out.println(ZoneId.of("+01:00"));
System.out.println(ZoneId.of("UTC+01:00"));
System.out.println(ZoneId.of("America/Chicago"));
System.out.println(ZoneId.ofOffset("UTC", ZoneOffset.of("+01:00")));

输入结果:

Asia/Shanghai
+01:00
UTC+01:00
America/Chicago
UTC+01:00

创建ZoneOffSet

System.out.println(ZoneOffset.ofHours(3));
System.out.println(ZoneOffset.ofHoursMinutesSeconds(1, 2, 3));
System.out.println(ZoneOffset.of("+01:00"));

输出结果:

+03:00
+01:02:03
+01:00

单独看ZoneId和ZoneOffSet可能还不能完全看出使用效果,下面看看带时区的日期时间

ZoneDateTime

表示ISO-8601日历系统中具有时区的日期时间,此类存储所有日期和时间字段,精度为纳秒,时区为区域偏移量,用于处理模糊的本地日期时间。

例如:2020-07-06T19:24:37.156+08:00[Asia/Shanghai]

ZonedDateTime相当于拥有三个独立对象,一个本地日期时间LocalDateTime ,一个时区IDZoneId和时间偏移量ZoneOffset

偏移量和本地日期时间用于在必要时定义一个瞬时时间。 时区ID用于获取偏移量的具体规则。(因为在部分区域夏时令时的偏移量与平常不同)

来看看ZoneDateTime的常用方法

初始化

//默认系统时区
System.out.println(ZonedDateTime.now());
//指定一个时区的时间
System.out.println(ZonedDateTime.now(Clock.system(ZoneId.of("Europe/Paris"))));
//指定一个偏移量的时间
System.out.println(ZonedDateTime.now(Clock.system(ZoneOffset.of("+04:00"))));
//根据本地日期时间和系统时区组合日期时间
System.out.println(ZonedDateTime.of(LocalDateTime.now(), ZoneId.systemDefault()));
//根据年月日时分秒毫秒纳秒时区id构建
System.out.println(ZonedDateTime.of(2020, 1, 1, 1, 1, 1, 111, ZoneId.of("Europe/Paris")));

输出结果:

2020-07-10T11:44:15.651+08:00[Asia/Shanghai]
2020-07-10T05:44:15.653+02:00[Europe/Paris]
2020-07-10T07:44:15.668+04:00
2020-07-10T11:44:15.668+08:00[Asia/Shanghai]
2020-01-01T01:01:01.000000111+01:00[Europe/Paris]

其他方法

ZonedDateTime z = ZonedDateTime.of(LocalDateTime.now(), ZoneId.systemDefault());System.out.println(z.getZone());//获取时区信息
System.out.println(z.getOffset());//获取时间偏移量
System.out.println(z.getDayOfMonth());//获取当月第几天
System.out.println(z.getDayOfWeek());//获取本周星期几
System.out.println(z.getDayOfYear());//获取本年第几天
//获取时间信息
System.out.println(z.getYear()+"/"+z.getMonthValue()+"/"+z.getDayOfMonth()+" "+z.getHour()+":"+z.getMinute()+":"+z.getSecond()+"."+z.getNano());
//加减时间
System.out.println(z.plusHours(3));
System.out.println(z.minusHours(3));
//修改时间
System.out.println(z.withHour(20));

输出结果

Asia/Shanghai
+08:00
10
FRIDAY
192
2020/7/10 13:37:19.37000000
2020-07-10T16:37:19.037+08:00[Asia/Shanghai]
2020-07-10T10:37:19.037+08:00[Asia/Shanghai]
2020-07-10T20:37:19.037+08:00[Asia/Shanghai]

时区与偏移量

本文开始的时候介绍了ZoneId和ZoneOffSet,在Java8中这两个类都可以对日期时间进行时区的转换,但是我更推荐使用时区信息(ZoneId),而不是时间偏移量(ZoneOffset)

首先需要重温一下概念

  • ZoneId表示一个时区实例,他的内部定义了一个地区的时区规则集,例如Europe/Paris
  • ZoneOffSet表示与UTC时间的偏移时间,格式为+08:00-04:00

这里我们以亚洲上海时间(北京时间)—>法国巴黎时间为例,对三月份的时间和六月份两个时间进行转换

ZoneId zoneId = ZoneId.of("Europe/Paris");
ZonedDateTime now = ZonedDateTime.now().withMonth(6);
System.out.println("6月的此时北京时间:"+now);
System.out.println("6月的此时巴黎时间:"+now.withZoneSameInstant(zoneId));
ZonedDateTime newTime = now.withMonth(3);
System.out.println("3月的此时北京时间:"+newTime);
System.out.println("3月的此时巴黎时间:"+newTime.withZoneSameInstant(zoneId));

输出结果:

6月的此时北京时间:2020-06-10T14:23:48.756+08:00[Asia/Shanghai]
6月的此时巴黎时间:2020-06-10T08:23:48.756+02:00[Europe/Paris]
3月的此时北京时间:2020-03-10T14:23:48.756+08:00[Asia/Shanghai]
3月的此时巴黎时间:2020-03-10T07:23:48.756+01:00[Europe/Paris]

有没有发现什么异样?

两个同一时刻不同月份的时间转换了时区后第一次偏移量为2小时,第二次为1小时

这是因为部分国家存在夏时令这种骚操作,一年中不同的月份有着不同的时间偏移量。

如果我们使用ZoneOffset,假设你知道目标时区的多种偏移时间,那么可以进行代码判断处理,但是如果要转换的时区很多,或者完全没有考虑夏时令问题时,那么转换出来的时间将会超乎你的想象!!

Java时间处理5---Java8中时区相关类库介绍相关推荐

  1. JAVA时间类及java8新时间类

    文章目录 java.util.Date 时区 java.util.Date基本使用 初始化 输出时间 输出时差 打印毫秒数 比较时间 java.util.Date的子类 java.sql.Date的使 ...

  2. java时间格式转换_Java中System.currentTimeMillis()计算方式与时间的单位转换

    学会与时间赛跑才能赢得时间的尊重,把握好每一天,趁年轻! java中获取系统当前时间相信大家都会,这是经常用到的也是非常简单的,但还是要经常回顾下一些小细节哦! 一.时间的单位转换 1秒=1000毫秒 ...

  3. java 时间加减_Java中时间加减的比较

    public class TestDate{ public static void main(String[] args){ try{ Date date=new Date(); DateFormat ...

  4. java matcher group方法_Java中正则表达式相关类中Matcher.group()方法

    ##简介 最近在做一个项目,需要使用matcher.group()方法匹配出需要的内容. ##分组 正则表达式 AA((A)(B(C))) group()方法是针对()来说的,group(0)指的是整 ...

  5. java 8 string_String.join() --Java8中String类新增方法

    /*** Returns a new String composed of copies of the * {@codeCharSequence elements} joined together w ...

  6. 【java8中的时间操作】java8中获取月的最后一天或者总天数,JDK8 LocalDate AP

    缘起 前面有个需求,获取当前月和前5个月的最后一天,网上找了一下基本都是jdk7以前的,但实际上jdk8中有更简单的获取方式. public static void main(String[] arg ...

  7. 6410的系统时钟设置(中)---相关寄存器介绍

    上篇中已经详细分析了6410时钟系统的结构,现在就介绍下几个与时钟设置相关的寄存器. 1.APLL_LOCK.MPLL_LOCK.EPLL_LOCK 这三个寄存器的低十六位分别表示APLL.MPLL. ...

  8. java runtime是什么_java中Runtime类详细介绍

    Runtime类描述了虚拟机一些信息.该类采用了单例设计模式,可以通过静态方法 getRuntime()获取Runtime类实例.下面演示了获取虚拟机的内存信息: package Main; publ ...

  9. 在Spring Boot中实现相关ID(用于SOA /微服务中的分布式跟踪)

    上周参加了在Geecon上Sam Newman的微服务讨论后,我开始思考更多有关用于监视,报告和诊断的面向服务/微服务平台最可能的基本功能:相关ID. 关联ID允许在面向服务的复杂平台中进行分布式跟踪 ...

最新文章

  1. JavaScript初学者编程题(14)
  2. JDBC--Statement,PreparedStatement,CallableStatement的区别
  3. VTK:绘制截锥体用法实战
  4. 用C#快速往Excel写数据
  5. oracle 常用故障,Oracle常见问题解决方案汇总
  6. 《过早退出是一切失败的根源》读后感
  7. SQL中及Access的空值
  8. java spring mvc api_SpringMVC实现REST API
  9. java内存堆和栈_java中堆,栈主要区别及内存存储
  10. Description Resource Path LocationType Java compiler level does not match the version of the instal
  11. paip.提升程序稳定性---最佳实践
  12. mac 开启android 模拟器,折腾mac的经验积累 2:mac上如何玩安卓模拟器
  13. linux下分析prn,Linux下echo命令详解
  14. css实现椭圆绕圈动画
  15. android星星闪效果,H5使用canvas实现星星闪烁效果
  16. python中缺省值处理函数DataFrame.fillna()
  17. 苹果11微信表格服务器地址怎么填,苹果实用技巧:iPhone11手机微信打字怎么换行...
  18. 家长头疼的调皮男孩应该怎么管教
  19. Mac 没法登陆,进入Safe boot模式
  20. 弱网测试NEWT-----Network Emulator for Windows Toolkit

热门文章

  1. 数据库MySQL5.7.21win64位安装配置
  2. c++课程实训-银行系统
  3. 天涯明月刀怎么导入php捏脸数据,天涯明月刀捏脸数据怎么导入,天涯明月刀捏脸数据怎么导入数据...
  4. Vue学习(十一)Vue CLI脚手架
  5. CMIP6数据处理方法与典型案例分析
  6. 朴素贝叶斯分类器的例子
  7. php抖音多账号管理系统源码,抖老板(抖音多账号管理系统)
  8. 承蒙厚爱,我回归啦!未来也请继续加油鸭!
  9. 光学设计-英文参考书籍
  10. 数据可视化——matplotlib(2)