【Java技术指南】「Java8编程专题」让你真正会用对Java新版日期时间API编程指南

简介: 【Java技术指南】「Java8编程专题」让你真正会用对Java新版日期时间API编程指南

技术背景


一切都源于JSR-310规范


  • JSR-310规范提供一个新的和改进的Java日期与时间API,会在Java8中包含,可以下载OpenJDK早期发布版本试用,详细信息可见:jdk8.java.net/download.ht…


  • JSR-310规范领导者Stephen Colebourne就是joda-time作者,其主要思想也是借鉴了joda-time,而不是直接把joda-time移植到Java平台中,API是类似的,但做了改进和调整。





代替Date类的日期类(LocalXX系列)


首当其冲的是LocalDateTime、LocalDate、LocalTime ,提供了对java.util.Date的替代,另外还提供了新的DateTimeFormatter用于对格式化/解析的支持


  • 介绍相关的XXX.now()的方法,这些太简单了,接下来介绍一下相关的较为特殊的用法,例如:


相对于ZoneId.systemDefault()默认时区


LocalDateTime now = LocalDateTime.now();
System.out.println(now);
复制代码


相当于使用默认时区时钟瞬时时间创建`Clock.systemDefaultZone()``;



相对于自定义时区

LocalDateTime now2= LocalDateTime.now(ZoneId.of("Europe/Paris"));
System.out.println(now2);
复制代码


会以相应的时区显示日期:欧洲的巴黎时区



自定义时钟


Clock clock = Clock.system(ZoneId.of("Asia/Dhaka"));  
LocalDateTime now3= LocalDateTime.now(clock);  
System.out.println(now3);
复制代码

与上面的一样,会以相应的时区显示日期



定义时间数据


不需要写什么相对时间 如java.util.Date 年是相对于1900 月是从0开始

//2013-12-31 23:59  
LocalDateTime d1 = LocalDateTime.of(2013, 12, 31, 23, 59);  
复制代码
//年月日 时分秒 纳秒
LocalDateTime d2 = LocalDateTime.of(2013, 12, 31, 23, 59,59, 11);
复制代码




使用瞬时时间 + 时区

Instant instant = Instant.now();
LocalDateTime d3 = LocalDateTime.ofInstant(Instant.now(), ZoneId.systemDefault());
System.out.println(d3);
复制代码



解析String->LocalDateTime

LocalDateTime d4 = LocalDateTime.parse("2013-12-31T23:59");
System.out.println(d4);
复制代码



999毫秒 等价于999000000纳秒

LocalDateTime d5 = LocalDateTime.parse("2013-12-31T23:59:59.999");
System.out.println(d5);
复制代码



使用DateTimeFormatter API 解析和格式化

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
LocalDateTime d6 = LocalDateTime.parse("2013/12/31 23:59:59", formatter);  
System.out.println(formatter.format(d6));  
复制代码



时间属性的获取

System.out.println(d6.getYear());  //获取年份
System.out.println(d6.getMonth());  //获取月份
System.out.println(d6.getDayOfYear());  // 获取当年的第几天
System.out.println(d6.getDayOfMonth());//获取属于本月的第几天
System.out.println(d6.getDayOfWeek());// 获取相对于本周的日期
System.out.println(d6.getHour());// 小时
System.out.println(d6.getMinute());  //分钟
System.out.println(d6.getSecond());  // 秒数
System.out.println(d6.getNano());  //纳秒数
复制代码



时间增减

LocalDateTime d7 = d6.minusDays(1);  
LocalDateTime d8 = d7.plus(1, IsoFields.QUARTER_YEARS);  
复制代码






代替System.currentTimeMillis()的瞬时对象(Instant)


瞬时时间,等价于以前的System.currentTimeMillis()

  • 瞬时时间 相当于以前的System.currentTimeMillis()
Instant instant1 = Instant.now();
//精确到秒 得到相对于1970-01-01 00:00:00 UTC的一个时间
System.out.println(instant1.getEpochSecond());
//精确到毫秒
System.out.println(instant1.toEpochMilli()); 
复制代码
  • 获取系统UTC默认时钟
Clock clock1 = Clock.systemUTC(); 
//得到时钟的瞬时时间
Instant instant2 = Instant.now(clock1);
System.out.println(instant2.toEpochMilli());
复制代码
  • 固定瞬时时间时钟
Clock clock2 = Clock.fixed(instant1, ZoneId.systemDefault()); 
Instant instant3 = Instant.now(clock2);//得到时钟的瞬时时间  
System.out.println(instant3.toEpochMilli());//与上面的 instant1代表的含义一样!
复制代码





Clock时钟


类似于钟表的概念,提供了如系统时钟、固定时钟、特定时区的时钟

//时钟提供给我们用于访问某个特定 时区的 瞬时时间、日期和时间的。



系统默认UTC时钟(当前瞬时时间 System.currentTimeMillis())


Clock c1 = Clock.systemUTC(); 
System.out.println(c1.millis()); //每次调用将返回当前瞬时时间(UTC)  
复制代码


系统默认时区时钟(当前瞬时时间)


Clock c2 = Clock.systemDefaultZone(); 
Clock c31 = Clock.system(ZoneId.of("Europe/Paris")); //巴黎时区  
System.out.println(c31.millis()); //每次调用将返回当前瞬时时间(UTC)  
复制代码


Clock c32 = Clock.system(ZoneId.of("Asia/Shanghai"));//上海时区  
System.out.println(c32.millis());//每次调用将返回当前瞬时时间(UTC)  
复制代码


Clock c4 = Clock.fixed(Instant.now(), ZoneId.of("Asia/Shanghai"));//固定上海时区时钟  
System.out.println(c4.millis());  
Thread.sleep(1000);  
System.out.println(c4.millis()); //不变 即时钟时钟在那一个点不动  
复制代码


Clock c5 = Clock.offset(c1, Duration.ofSeconds(2)); //相对于系统默认时钟两秒的时钟  
System.out.println(c1.millis());  
System.out.println(c5.millis());  
复制代码




ZonedDateTime


  • 带有时区的date-time 存储纳秒、时区和时差(避免与本地date-time歧义);API和LocalDateTime类似。
  • API和LocalDateTime类似,只是多了时差(如2013-12-20T10:35:50.711+08:00[Asia/Shanghai])
ZonedDateTime now = ZonedDateTime.now();
System.out.println(now);
复制代码
ZonedDateTime now2= ZonedDateTime.now(ZoneId.of("Europe/Paris"));  
System.out.println(now2);
复制代码



其他的用法也是类似的 就不介绍了


ZonedDateTime z1 = ZonedDateTime.parse("2013-12-31T23:59:59Z[Europe/Paris]");
System.out.println(z1);
复制代码




Duration


表示两个瞬时时间的时间段

Duration d1 = Duration.between(Instant.ofEpochMilli(System.currentTimeMillis() - 12323123), Instant.now());
//得到相应的时差
System.out.println(d1.toDays());  
System.out.println(d1.toHours());  
System.out.println(d1.toMinutes());  
System.out.println(d1.toMillis());  
System.out.println(d1.toNanos());  
//1天时差 类似的还有如ofHours()  
Duration d2 = Duration.ofDays(1);  
System.out.println(d2.ofHours());
复制代码




Calendar的替代者Chronology


Chronology用于对年历系统的支持,是java.util.Calendar的替代者

//提供对java.util.Calendar的替换,提供对年历系统的支持  
Chronology c  = HijrahChronology.INSTANCE; 
ChronoLocalDateTime d = c.localDateTime(LocalDateTime.now());  
System.out.println(d);  
复制代码


年、年月、月日、周期的API支持

Year year = Year.now();  
YearMonth yearMonth = YearMonth.now();
MonthDay monthDay = MonthDay.now();
System.out.println(year);//年  
System.out.println(yearMonth); //年-月  
System.out.println(monthDay); // 月-日  
复制代码


Period 日期层面的间隔时间

周期,如表示10天前  3年5个月

Period period1 = Period.ofDays(10);
System.out.println(period1);
Period period2 = Period.of(3, 5, 0);
System.out.println(period2);
复制代码




参考文章


www.codedata.com.tw/java/jodati…www.codedata.com.tw/java/jodati…www.codedata.com.tw/java/jodati…



相关文章
|
15天前
|
NoSQL Java 数据库连接
深入探索 Java 后台开发的核心技术
【4月更文挑战第5天】本文探讨了Java后台开发的关键技术,包括Spring框架与Spring Boot的使用,MyBatis和Hibernate的ORM选择,关系型与NoSQL数据库的适用场景,线程池与异步处理在并发中的作用,微服务架构及RESTful API设计。这些核心技术有助于开发者打造稳定、高性能的Java后台系统,适应不断发展的云计算和人工智能需求。
|
21天前
|
缓存 Java C#
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍(一)
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍
60 0
|
1天前
|
Java 关系型数据库 MySQL
一套java+ spring boot与vue+ mysql技术开发的UWB高精度工厂人员定位全套系统源码有应用案例
UWB (ULTRA WIDE BAND, UWB) 技术是一种无线载波通讯技术,它不采用正弦载波,而是利用纳秒级的非正弦波窄脉冲传输数据,因此其所占的频谱范围很宽。一套UWB精确定位系统,最高定位精度可达10cm,具有高精度,高动态,高容量,低功耗的应用。
一套java+ spring boot与vue+ mysql技术开发的UWB高精度工厂人员定位全套系统源码有应用案例
|
2天前
|
存储 数据可视化 安全
Java全套智慧校园系统源码springboot+elmentui +Quartz可视化校园管理平台系统源码 建设智慧校园的5大关键技术
智慧校园指的是以物联网为基础的智慧化的校园工作、学习和生活一体化环境,这个一体化环境以各种应用服务系统为载体,将教学、科研、管理和校园生活进行充分融合。无处不在的网络学习、融合创新的网络科研、透明高效的校务治理、丰富多彩的校园文化、方便周到的校园生活。简而言之,“要做一个安全、稳定、环保、节能的校园。
20 6
|
3天前
|
监控 前端开发 算法
Java技术体系
Java技术体系(韩顺平老师整理)
7 0
|
3天前
|
存储 安全 Java
说说Java 8 引入的Stream API
说说Java 8 引入的Stream API
8 0
|
4天前
|
分布式计算 Java API
Java 8新特性之Lambda表达式与Stream API
【4月更文挑战第16天】本文将介绍Java 8中的两个重要新特性:Lambda表达式和Stream API。Lambda表达式是Java 8中引入的一种新的编程语法,它允许我们将函数作为参数传递给其他方法,从而使代码更加简洁、易读。Stream API是Java 8中引入的一种新的数据处理方式,它允许我们以声明式的方式处理数据,从而使代码更加简洁、高效。本文将通过实例代码详细讲解这两个新特性的使用方法和优势。
|
7天前
|
存储 Java 关系型数据库
掌握Java 8 Stream API的艺术:详解流式编程(一)
掌握Java 8 Stream API的艺术:详解流式编程
37 1
|
10天前
|
Java BI
Java 获取周,月,年日期集合(统计图)
Java 获取周,月,年日期集合(统计图)
Java 获取周,月,年日期集合(统计图)
|
12天前
|
Java
java判断时间是否为节假日(或指定的日期),是的话返回true,否返回false
java判断时间是否为节假日(或指定的日期),是的话返回true,否返回false
21 0