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



相关文章
|
4天前
|
缓存 监控 API
淘宝 API 接口使用的技术要点与注意事项
在数字化商业环境中,淘宝API为开发者提供了强大的工具,用于与淘宝平台交互,获取商品信息及处理交易等。本文总结了正确使用API的关键技术要点:注册认证、理解接口文档、遵守调用限制、确保参数准确性、保护数据安全、处理异常、性能优化、版本兼容、合规性及日志监控,帮助开发者实现高效、安全的程序开发。
|
3天前
|
Java 开发者
【Java编程新纪元】JDK 22:超级构造函数来袭,super(...) 前导语句改写编程规则!
【9月更文挑战第6天】JDK 22的超级构造函数特性是Java编程语言发展史上的一个重要里程碑。它不仅简化了代码编写,还提升了代码的可读性和维护性。我们有理由相信,在未来的Java版本中,还将有更多令人兴奋的新特性等待我们去发现和应用。让我们共同期待Java编程新纪元的到来!
|
3天前
|
Oracle Java 关系型数据库
【颠覆性升级】JDK 22:超级构造器与区域锁,重塑Java编程的两大基石!
【9月更文挑战第6天】JDK 22的发布标志着Java编程语言在性能和灵活性方面迈出了重要的一步。超级构造器和区域锁这两大基石的引入,不仅简化了代码设计,提高了开发效率,还优化了垃圾收集器的性能,降低了应用延迟。这些改进不仅展示了Oracle在Java生态系统中的持续改进和创新精神,也为广大Java开发者提供了更多的可能性和便利。我们有理由相信,在未来的Java编程中,这些新特性将发挥越来越重要的作用,推动Java技术不断向前发展。
|
2天前
|
Java 开发者
Java中的多线程编程基础与实战
【9月更文挑战第6天】本文将通过深入浅出的方式,带领读者了解并掌握Java中的多线程编程。我们将从基础概念出发,逐步深入到代码实践,最后探讨多线程在实际应用中的优势和注意事项。无论你是初学者还是有一定经验的开发者,这篇文章都能让你对Java多线程有更全面的认识。
12 1
|
6天前
|
存储 Java
Java编程中的对象序列化与反序列化
【9月更文挑战第2天】在Java的世界里,对象序列化和反序列化就像是给数据穿上了一件隐形的斗篷。它们让数据能够轻松地穿梭于不同的系统之间,无论是跨越网络还是存储在磁盘上。本文将揭开这层神秘的面纱,带你领略序列化和反序列化的魔法,并展示如何通过代码示例来施展这一魔法。
10 0
|
8天前
|
Java 开发者
Java编程中的异常处理机制探究
【8月更文挑战第31天】在Java的世界中,异常处理是维护程序稳定性的重要工具。它像是一套精密的免疫系统,保护代码免受错误的侵袭,确保程序能够优雅地应对意外情况。本文将带你走进Java的异常处理机制,了解如何捕获和处理异常,以及自定义异常类的创建与应用,让你的代码更加健壮,运行更加顺畅。
|
8天前
|
开发者 C# Windows
WPF与游戏开发:当桌面应用遇见游戏梦想——利用Windows Presentation Foundation打造属于你的2D游戏世界,从环境搭建到代码实践全面解析新兴开发路径
【8月更文挑战第31天】随着游戏开发技术的进步,WPF作为.NET Framework的一部分,凭借其图形渲染能力和灵活的UI设计,成为桌面游戏开发的新选择。本文通过技术综述和示例代码,介绍如何利用WPF进行游戏开发。首先确保安装最新版Visual Studio并创建WPF项目。接着,通过XAML设计游戏界面,并在C#中实现游戏逻辑,如玩家控制和障碍物碰撞检测。示例展示了创建基本2D游戏的过程,包括角色移动和碰撞处理。通过本文,WPF开发者可更好地理解并应用游戏开发技术,创造吸引人的桌面游戏。
18 0
|
9天前
|
开发者 C# 存储
WPF开发者必读:资源字典应用秘籍,轻松实现样式与模板共享,让你的WPF应用更上一层楼!
【8月更文挑战第31天】在WPF开发中,资源字典是一种强大的工具,用于共享样式、模板、图像等资源,提高了应用的可维护性和可扩展性。本文介绍了资源字典的基础知识、创建方法及最佳实践,并通过示例展示了如何在项目中有效利用资源字典,实现资源的重用和动态绑定。
23 0
|
6天前
|
监控 Java 调度
【Java学习】多线程&JUC万字超详解
本文详细介绍了多线程的概念和三种实现方式,还有一些常见的成员方法,CPU的调动方式,多线程的生命周期,还有线程安全问题,锁和死锁的概念,以及等待唤醒机制,阻塞队列,多线程的六种状态,线程池等
37 6
【Java学习】多线程&JUC万字超详解
|
5天前
|
存储 Java 程序员
优化Java多线程应用:是创建Thread对象直接调用start()方法?还是用个变量调用?
这篇文章探讨了Java中两种创建和启动线程的方法,并分析了它们的区别。作者建议直接调用 `Thread` 对象的 `start()` 方法,而非保持强引用,以避免内存泄漏、简化线程生命周期管理,并减少不必要的线程控制。文章详细解释了这种方法在使用 `ThreadLocal` 时的优势,并提供了代码示例。作者洛小豆,文章来源于稀土掘金。