java8已经出来很久了,马上java9也要出来了,说实话真的很少用到java8中的一些特性,可能跟自己的知识更新速度有关,因为项目上的需要使用到了java8里面的新引入的time类,所以在这里我主要是参照别人的文章以及自己的使用总结一下,也给自己以后留着参考。
参考
http://blog.csdn.net/chenleixing/article/details/44408875
http://www.cnblogs.com/565261641-fzh/p/5683594.html
http://blog.csdn.net/jingyuwang1/article/details/72858695
jdk1.8引入了全新的日期和时间组件,并把它们归纳到一系列的包下。为什么要开发一套全新的处理日期和时间的API呢?因为旧的java.util.Date非常难用。比如java.util.Date月份从0开始,一月是0,十二月是11,所以在使用的时候还得自己手动的去计算。但是在jdk1.8的版本中java.time.LocalDate月份和星期都改成了enum,使用的时候直接调用枚举值就可以了,也不会出错。同时在核心包java.time使用的历法采用ISO-8601标准,当然,我们也可以使用java.time.chrono包中的一些非标准的历法,比如日本帝国历法(天皇年号)、泰国佛教历法(佛陀诞生)、中华民国历法(辛亥革命)、伊斯兰黑蚩拉历法。
在jdk1.8中新增的日期和时间相关的类都是线程安全的,为什么是线程安全的呢?是因为它们都是使用了final修饰了的,所以一旦初始化所有的日期和时间值就不会在变化,而jdk1.8之前的版本定义的ava.util.Date定义为可修改的以及将SimpleDateFormat实现成非线程安全的。java.util.Date是一个“万能接口”,它包含日期、时间,还有毫秒数,如果你只想用java.util.Date存储日期,或者只存储时间,那么,只有你知道哪些部分的数据是有用的,哪些部分的数据是不能用的。在新的Java 8中,日期和时间被明确划分为LocalDate和LocalTime,LocalDate无法包含时间,LocalTime无法包含日期。当然,LocalDateTime才能同时包含日期和时间。jdk1.8中新的时间及日期API位于java.time包中,下面是里面的一些关键的类:
.Instant——本质上是一个数字时间戳,底层实际上是对System.currentTimeMillis()进行了包装。
.LocalDate——不包含具体时间的日期,比如2014-01-14。它可以用来存储生日,周年纪念日,入职日期等。
.LocalTime——它代表的是不含日期的时间,格式为13:01:02.221。
.LocalDateTime——它包含了日期及时间,不过还是没有偏移信息或者说时区。
.Period——两个日期之间的天、月、年数差值,当然,我们也可以直接使用日期中的until方法来完成同样的效果。
.Duration——两个日期时间间隔的秒以及纳秒数。
.ZonedDateTime——这是一个包含时区的完整的日期时间,偏移量是以UTC/格林威治时间为基准的。
当然在jdk1.8中新增了对日期格式化方式的DateTimeFormatter类,在下面的例子中将会介绍新的日期相关类的操作,基本包含了平时使用的要求,如果需要更多详细的相关类使用方法可以查看具体的jdk1.8相关的API。
1.获取当前日期
//获取当前日期 LocalDate today = LocalDate.now(); System.out.println(today);
2.获取当前年月日
//获取当前年月日 LocalDate today = LocalDate.now(); int year = today.getYear(); int month = today.getMonthValue(); int day = today.getDayOfMonth(); System.out.printf("当前年月日分别是:年=%d,月=%d,日=%d \t %n",year,month,day);
3.创建特定日期
//创建特定日期 LocalDate birthDay = LocalDate.of(2013,9,5); System.out.println("创建特定的日期:" + birthDay.toString());
4.比较2个日期是否相等
//比较2个日期是否相等 //LocalDate localDate1 = LocalDate.of(2017,10,27); LocalDate localDate1 = LocalDate.of(2013,9,5); LocalDate today = LocalDate.now(); if(localDate1.equals(today)){ System.out.printf("today %s and localDate1 %s are same date \t %n", today, localDate1); }else { System.out.printf("today %s and localDate1 %s are not same date \t %n", today, localDate1); }
5.检查是否是重复的事件,如生日
//检查是否是重复的事件,如生日 LocalDate birthDay = LocalDate.of(2013,10,27); MonthDay monthDay = MonthDay.of(birthDay.getMonthValue(),birthDay.getDayOfMonth()); MonthDay currentMonthDay = MonthDay.now(); if(monthDay.equals(currentMonthDay)){ System.out.println("happy birthday"); }else { System.out.println("Sorry,today is not your birthday"); }
6.获取当前时间
//获取当前时间 LocalTime currentTime = LocalTime.now(); System.out.println("现在时间:" + currentTime);
7.在当前的时间基础上添加小时
//在当前的时间基础上添加小时,分,秒调用不同的函数,减去时间也一样调用不同函数而已 LocalTime currentTime = LocalTime.now(); int plusHours = 2; currentTime = currentTime.plusHours(plusHours); System.out.println("当前时间添加" + plusHours + "后的时间是:" + currentTime);
8.获取一周后的日期
//获取一周后的日期,获取其他相关日期调用不同参数或函数 LocalDate today = LocalDate.now(); LocalDate nextWeekDay = today.plus(1, ChronoUnit.WEEKS); System.out.println("一周后的今天是:" + nextWeekDay);
9.根据Clock获取某个时区下当前的瞬时时间,日期或者时间
//获取某个时区下当前的瞬时时间,日期或者时间,可替代System.currentTimeInMillis()与 TimeZone.getDefault()方法 Clock clock = Clock.systemUTC(); System.out.println(clock.instant().toString()); System.out.println("当前时间距离1970-01-01T00:00Z (UTC)的毫秒数:" + clock.millis()); Clock clock1 = Clock.systemDefaultZone(); System.out.println(clock1.instant().toString());
10.测试日期的先后顺序
//测试日期的先后顺序 LocalDate today = LocalDate.now(); LocalDate yesterday = today.minus(1,ChronoUnit.DAYS); if(yesterday.isBefore(today)){ System.out.println(yesterday + "比" + today + "早"); }else { System.out.println(yesterday + "比" + today + "晚"); }
11.处理不同时区
//处理不同时区 LocalDateTime localDateTime = LocalDateTime.now(); ZonedDateTime zonedDateTime = ZonedDateTime.of(localDateTime,ZoneId.of("America/New_York")); System.out.println(zonedDateTime.toString());
12.测试一个月的天数
//测试一个月的天数 YearMonth yearMonth = YearMonth.now(); int days = yearMonth.lengthOfMonth(); System.out.printf("当前的年份是:%d,月份是:%d,一共有:%d天\n",yearMonth.getYear(),yearMonth.getMonthValue(),days);
13.测试是否是闰年
//测试是否是闰年 //LocalDate today = LocalDate.now(); LocalDate today = LocalDate.of(2016,5,6); if(today.isLeapYear()){ System.out.printf("当前年份是%d,并且是闰年\n",today.getYear()); }else { System.out.printf("当前年份是%d,并且是平年\n",today.getYear()); }
14.测试2个日期之间的天数和月数,年数
//测试2个日期之间的天数和月数,年数 LocalDate today = LocalDate.now(); LocalDate localDate = LocalDate.of(2016,3,29); Period period = Period.between(localDate,today); System.out.printf("%s与%s之间相隔的时间是%d年%d个月%d天\n",today,localDate,period.getYears(),period.getMonths(),period.getDays()); //直接使用日期类中的方法计算日期间隔 long days = localDate.until(today,ChronoUnit.DAYS); System.out.println("使用日期类计算间隔的天数:" + days); long weeks = localDate.until(today,ChronoUnit.WEEKS); System.out.println("使用日期类计算间隔的周数:" + weeks);
15.测试2个时间直接间隔的秒和纳秒
//测试2个时间直接间隔的秒和纳秒 LocalDateTime now = LocalDateTime.now(); LocalDateTime yesterdayNow = now.minusDays(1).minusNanos(2); Duration duration = Duration.between(yesterdayNow,now); System.out.printf("%s和%s之间间隔的%d秒%d纳秒\n",yesterdayNow,now,duration.get(ChronoUnit.SECONDS),duration.get(ChronoUnit.NANOS));
16.带时区偏移量的日期与时间
//带时区偏移量的日期与时间 LocalDateTime localDateTime = LocalDateTime.of(2017,6,8,12,20,30); //添加印度的时区GMT或者UTC5:30 ZoneOffset zoneOffset = ZoneOffset.of("+05:30"); OffsetDateTime offsetDateTime = OffsetDateTime.of(localDateTime,zoneOffset); System.out.println("带时区偏移量的日期与时间:"+ offsetDateTime.toString());
17.获取当前时间戳
//获取当前时间戳 Instant instant = Instant.now(); System.out.println("当前时间戳是:" + instant);
18.测试格式化时间
//测试格式化时间 String date = "20171027"; LocalDate formatDate = LocalDate.parse(date, DateTimeFormatter.BASIC_ISO_DATE); System.out.printf("格式化前的日期%s,格式化后的日期%s\n",date,formatDate);
19.自定义格式化方式
//自定义格式化方式,自定义的格式要和格式化的字符串表示一样,否则报错 String date = "2017 1027"; DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy MMdd"); LocalDate formatDate = LocalDate.parse(date, dateTimeFormatter); System.out.printf("自定义格式化前的日期%s,格式化后的日期%s\n",date,formatDate);
20.日期格式化为字符串
//日期格式化为字符串,可以自定义格式化 LocalDateTime now = LocalDateTime.now(); DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy MM dd hh:ss:mm"); String formatDateTime = dateTimeFormatter.format(now); System.out.println("日期格式化为字符串:" + formatDateTime);
21.获取当前时间的毫秒,微秒,纳秒数以及从毫秒转换为时间
//获取当前时间的毫秒,微秒,纳秒数以及从毫秒转换为时间 Instant instant = Instant.now(); System.out.println("当前时间:" + instant.toString()); //毫秒 System.out.println("当前时间的毫秒数:" + instant.get(ChronoField.MILLI_OF_SECOND)); //微秒 System.out.println("当前时间的微秒数:" + instant.get(ChronoField.MICRO_OF_SECOND)); //纳秒 System.out.println("当前时间的纳秒数:" + instant.get(ChronoField.MICRO_OF_SECOND)); //毫秒转Instant LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault()); System.out.println("毫秒转Instant:" + localDateTime);
相关推荐
Java 8引入了许多新的功能和改进,包括Lambda表达式、接口默认方法、函数式接口、流API、Date/Time API、Nashorn JavaScript引擎等。这些新功能和改进使得Java编程变得更加简单、直观和高效,并提升了JVM的性能和...
jdk1.8的新特性,包括Lambda 表达式,方法引用 默认方法,新工具,Stream API,Date Time API,Optional 类,Nashorn, JavaScript 引擎
以上的一些程序代码均为张老师课堂即兴发挥所写,也可以看出,张老师对JAVA特性的深刻理解能力!现在说说我对这些程序代码的理解,说实话,才开始听张老师讲的时候,我感觉很模糊的,但是当我真正理解了之后,觉得...
Java8新增了date和time的util包,下面这篇文章主要给大家介绍了关于java8新特性教程之time包使用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小...
Jdk8新特性例子,内容包含 接口默认方法, 函数引用, java.util.stream api 和java.time api map的新增方法等。例子采用记事本编写,下载者需自行下载jdk8安装并配置好环境,编译(javac)运行(java)
新特性总览 接口默认方法和静态方法 Lambda 表达式 函数式接口 方法引用 Stream Optional Date/Time API 重复注解 扩展注解的支持 Base64 JavaFX 其它
- 代码更少(增加了新的语法:==Lambda表达式==) - 强大的==Stream API== - **Date Time API** − 加强对日期与时间的处理 - 便于并行 - 最大化减少空指针的异常: **Optional类** - Nashorn 引擎,允许在JVM上运行...
新的时间API(java.time强烈推荐使用) 内置Base64工具 Jdk9新特性 PS: jdk9应该是继jdk8之后,又一个重要的版本,后续jdk的迭代,都是基于jdk9来完成的。 模块化: 模块化是jdk9或者说jdk8之后最大的改进,在jdk8及...
Java 8 在包java.time下包含了一组全新的时间日期API。下面通过示例给大家讲解java8 新特征日期api的相关知识,感兴趣的朋友一起看看吧
第1章 java体系结构介绍 1.1 为什么使用java 1.2 网络带来的挑战和机遇 1.3 体系结构 1.3.1 java虚拟机 1.3.2 类装载器的体系结构 1.3.3 java class文件 1.3.4 java api 1.3.5 java程序设计...
JDK(Java Development Kit)1.8是Java平台的一个版本,也被称为Java 8。下面是关于JDK 1.8的一些介绍: 1. Lambda表达式:JDK 1.8引入了Lambda表达式,这是一种函数式编程的特性,使得开发人员能够以更简洁的方式...
java8新特性 Stream Api Lambda 表达式 行为参数化 接口中的默认方法 Date Time Api Optional 类 Stream 和 Collection的区别 Stream 描述对数据的计算 Collection 存储和访问数据 行为参数化 让方法接受多种行为...
java8 源码 Java8 Java 8 (又称为 jdk 1.8) 是 Java 语言开发的一个主要版本。 Oracle 公司于 2014 年 3 月 18 日发布 Java 8 ,它支持函数式编程,新的 JavaScript 引擎,新的日期 API,新的Stream API 等。 Java8 ...
Java8 新增了非常多的特性,我们主要讨论以下几个: Lambda 表达式 − Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中。 方法引用 − 方法引用提供了非常有用的语法,可以直接引用已有Java类或对象...
显著增加和完善Java语言特性,增添标准库,包括默认方法,新的java.util.stream包及 Date-Time API; Compact Profiles包含 Java SE平台预定义子集,使程序员无需部署在整个平台,可运行在小型设备上; 安全性包括...
BEA WebLogic Real Time (WLRT)服务器提供了一种基于Java的基础架构来满足实时处理需求。这在Java领域中是比较少见的:按照实时需求处理请求,而不是...在文章的末尾,我们将简要介绍与WebLogic Real Time相关的用例。
java8于2014年发布,相比于java7,java8新增了非常多的特性,如lambda表达式、函数式接口、方法引用、默认方法、新工具(编译工具)、Stream API、Date Time API、Optional等 。 当前很多公司的老产品依然使用的java...