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



相关文章
|
20天前
|
存储 监控 安全
单位网络监控软件:Java 技术驱动的高效网络监管体系构建
在数字化办公时代,构建基于Java技术的单位网络监控软件至关重要。该软件能精准监管单位网络活动,保障信息安全,提升工作效率。通过网络流量监测、访问控制及连接状态监控等模块,实现高效网络监管,确保网络稳定、安全、高效运行。
46 11
|
30天前
|
XML Java 编译器
Java注解的底层源码剖析与技术认识
Java注解(Annotation)是Java 5引入的一种新特性,它提供了一种在代码中添加元数据(Metadata)的方式。注解本身并不是代码的一部分,它们不会直接影响代码的执行,但可以在编译、类加载和运行时被读取和处理。注解为开发者提供了一种以非侵入性的方式为代码提供额外信息的手段,这些信息可以用于生成文档、编译时检查、运行时处理等。
64 7
|
12天前
|
移动开发 前端开发 Java
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
JavaFX是Java的下一代图形用户界面工具包。JavaFX是一组图形和媒体API,我们可以用它们来创建和部署富客户端应用程序。 JavaFX允许开发人员快速构建丰富的跨平台应用程序,允许开发人员在单个编程接口中组合图形,动画和UI控件。本文详细介绍了JavaFx的常见用法,相信读完本教程你一定有所收获!
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
|
2天前
|
XML 算法 API
通过亚马逊产品广告API获取国际商品详情的技术实现
本文详细介绍如何通过亚马逊产品广告API获取国际商品信息。首先,需注册亚马逊联盟账户并申请API访问权限,获取AWS Access Key ID等凭证。接着,解析API端点和服务,如ItemLookup和ItemSearch。然后,构建API请求,包括URL、参数设置及签名生成。以Python为例,使用requests或boto3库实现API调用,并处理XML格式的API响应。最后,注意API速率限制、区域设置、数据更新及错误处理。参考官方文档确保调用准确性和安全性。
|
13天前
|
JSON Java Apache
Java基础-常用API-Object类
继承是面向对象编程的重要特性,允许从已有类派生新类。Java采用单继承机制,默认所有类继承自Object类。Object类提供了多个常用方法,如`clone()`用于复制对象,`equals()`判断对象是否相等,`hashCode()`计算哈希码,`toString()`返回对象的字符串表示,`wait()`、`notify()`和`notifyAll()`用于线程同步,`finalize()`在对象被垃圾回收时调用。掌握这些方法有助于更好地理解和使用Java中的对象行为。
|
10天前
|
JSON 搜索推荐 API
拍立淘API是基于图像识别技术的服务接口,支持淘宝、1688和义乌购平台。
拍立淘API是基于图像识别技术的服务接口,支持淘宝、1688和义乌购平台。用户上传图片后,系统能快速匹配相似商品,提供精准搜索结果,并根据用户历史推荐个性化商品,简化购物流程。开发者需注册账号并获取API Key,授权权限后调用接口,返回商品详细信息如ID、标题、价格等。使用时需遵守频率限制,确保图片质量,保障数据安全。
|
27天前
|
算法 Java API
如何使用Java开发获得淘宝商品描述API接口?
本文详细介绍如何使用Java开发调用淘宝商品描述API接口,涵盖从注册淘宝开放平台账号、阅读平台规则、创建应用并申请接口权限,到安装开发工具、配置开发环境、获取访问令牌,以及具体的Java代码实现和注意事项。通过遵循这些步骤,开发者可以高效地获取商品详情、描述及图片等信息,为项目和业务增添价值。
58 10
|
2月前
|
监控 安全 Java
Java中的多线程编程:从入门到实践####
本文将深入浅出地探讨Java多线程编程的核心概念、应用场景及实践技巧。不同于传统的摘要形式,本文将以一个简短的代码示例作为开篇,直接展示多线程的魅力,随后再详细解析其背后的原理与实现方式,旨在帮助读者快速理解并掌握Java多线程编程的基本技能。 ```java // 简单的多线程示例:创建两个线程,分别打印不同的消息 public class SimpleMultithreading { public static void main(String[] args) { Thread thread1 = new Thread(() -> System.out.prin
|
2月前
|
安全 Java 调度
Java中的多线程编程入门
【10月更文挑战第29天】在Java的世界中,多线程就像是一场精心编排的交响乐。每个线程都是乐团中的一个乐手,他们各自演奏着自己的部分,却又和谐地共同完成整场演出。本文将带你走进Java多线程的世界,让你从零基础到能够编写基本的多线程程序。
37 1
|
2月前
|
Java 数据处理 开发者
Java多线程编程的艺术:从入门到精通####
【10月更文挑战第21天】 本文将深入探讨Java多线程编程的核心概念,通过生动实例和实用技巧,引导读者从基础认知迈向高效并发编程的殿堂。我们将一起揭开线程管理的神秘面纱,掌握同步机制的精髓,并学习如何在实际项目中灵活运用这些知识,以提升应用性能与响应速度。 ####
52 3