【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…



相关文章
|
3天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
14 2
|
11天前
|
JSON 前端开发 JavaScript
java-ajax技术详解!!!
本文介绍了Ajax技术及其工作原理,包括其核心XMLHttpRequest对象的属性和方法。Ajax通过异步通信技术,实现在不重新加载整个页面的情况下更新部分网页内容。文章还详细描述了使用原生JavaScript实现Ajax的基本步骤,以及利用jQuery简化Ajax操作的方法。最后,介绍了JSON作为轻量级数据交换格式在Ajax应用中的使用,包括Java中JSON与对象的相互转换。
24 1
|
16天前
|
SQL Java 数据库连接
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率。本文介绍了连接池的工作原理、优势及实现方法,并提供了HikariCP的示例代码。
30 3
|
16天前
|
SQL 监控 Java
Java连接池技术的最新发展,包括高性能与低延迟、智能化管理与监控、扩展性与兼容性等方面
本文探讨了Java连接池技术的最新发展,包括高性能与低延迟、智能化管理与监控、扩展性与兼容性等方面。同时,结合最佳实践,介绍了如何选择合适的连接池库、合理配置参数、使用监控工具及优化数据库操作,以实现高效稳定的数据库访问。示例代码展示了如何使用HikariCP连接池。
10 2
|
16天前
|
Java 数据库连接 数据库
深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能
在Java应用开发中,数据库操作常成为性能瓶颈。本文通过问题解答形式,深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能。文章介绍了连接池的优势、选择和使用方法,以及优化配置的技巧。
16 1
|
16天前
|
算法 Java 数据库连接
Java连接池技术,从基础概念出发,解析了连接池的工作原理及其重要性
本文详细介绍了Java连接池技术,从基础概念出发,解析了连接池的工作原理及其重要性。连接池通过复用数据库连接,显著提升了应用的性能和稳定性。文章还展示了使用HikariCP连接池的示例代码,帮助读者更好地理解和应用这一技术。
31 1
|
4天前
|
监控 安全 Java
Java中的多线程编程:从入门到实践####
本文将深入浅出地探讨Java多线程编程的核心概念、应用场景及实践技巧。不同于传统的摘要形式,本文将以一个简短的代码示例作为开篇,直接展示多线程的魅力,随后再详细解析其背后的原理与实现方式,旨在帮助读者快速理解并掌握Java多线程编程的基本技能。 ```java // 简单的多线程示例:创建两个线程,分别打印不同的消息 public class SimpleMultithreading { public static void main(String[] args) { Thread thread1 = new Thread(() -> System.out.prin
|
13天前
|
安全 Java 调度
Java中的多线程编程入门
【10月更文挑战第29天】在Java的世界中,多线程就像是一场精心编排的交响乐。每个线程都是乐团中的一个乐手,他们各自演奏着自己的部分,却又和谐地共同完成整场演出。本文将带你走进Java多线程的世界,让你从零基础到能够编写基本的多线程程序。
29 1
|
20天前
|
Java 数据处理 开发者
Java多线程编程的艺术:从入门到精通####
【10月更文挑战第21天】 本文将深入探讨Java多线程编程的核心概念,通过生动实例和实用技巧,引导读者从基础认知迈向高效并发编程的殿堂。我们将一起揭开线程管理的神秘面纱,掌握同步机制的精髓,并学习如何在实际项目中灵活运用这些知识,以提升应用性能与响应速度。 ####
43 3
|
21天前
|
Java
Java中的多线程编程:从入门到精通
本文将带你深入了解Java中的多线程编程。我们将从基础概念开始,逐步深入探讨线程的创建、启动、同步和通信等关键知识点。通过阅读本文,你将能够掌握Java多线程编程的基本技能,为进一步学习和应用打下坚实的基础。