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);
相关推荐
6. **日期与时间API**:Java8改进了日期和时间的处理,引入了新的java.time包,包含了LocalDate、LocalTime、LocalDateTime、ZonedDateTime等类,提供了更强大且易于使用的日期和时间操作。 7. **Optional类**:...
Java 8是Java编程语言的一个重大更新,引入了许多新的特性和功能,极大地提高了开发效率和代码的可读性。以下是一些主要的Java 8新特性详解: 1. **Lambda表达式**:这是Java 8最显著的新特性之一,它为Java引入了...
Java 8引入了一个新的包`java.time`,它包含了用于日期时间处理的新类,如`LocalDate`、`LocalTime`和`LocalDateTime`等。这些类解决了旧日期时间API(如`Date`和`Calendar`)的一些问题,并提供了更现代的时间日期...
以下是关于Java 8新特性的详细讲解: 1. **函数式编程:Lambda表达式** Lambda表达式是Java 8中最显著的新特性,它允许我们将函数作为一个方法参数,或者以匿名函数的形式创建。Lambda表达式简洁且易于理解,使得...
自 Java 8 发布后,Java 有了许多显著的新特性,极大地提升了开发效率和代码质量。以下是对 Java 8 及之后版本主要新特性的深入剖析: 1. **Lambda 表达式**: Java 8 引入了 Lambda 表达式,使得函数式编程成为...
以下将详细讲解Java 8的一些核心新特性: 1. **lambda表达式**:这是Java 8最显著的特征之一。Lambda表达式允许开发者以简洁的方式定义匿名函数,使得函数式编程在Java中变得更加便捷。例如,可以使用`()->System....
Java 8 是一个里程碑式的版本,它引入了许多重要的新特性,极大地改变了Java的编程范式。以下是关于Java 8新特性的详细说明: 1. **Lambda表达式与Functional接口** Lambda表达式是Java 8最显著的特性之一,它允许...
在本精简版的Java 8新特性导师讲授中,我们将重点关注四大核心概念:Lambda表达式、Stream流、方法引用以及一些其他相关的重要更新。 1. Lambda表达式: Lambda表达式是Java 8中最引人注目的特性之一,它为函数式...
在这个"时间日期工具类(包含java8新特性).zip"压缩包中,我们有两个文件:DateUtil.java和DateUtils.java,它们很可能是自定义的工具类,用来扩展Java的标准日期处理功能。 首先,我们来看Java 8引入的新特性。在...
Java 8 是一个重要的版本更新,引入了许多新特性,极大地提升了开发效率和代码的可读性。以下将详细讲解其中的一些关键特性。 1. **Lambda 表达式**: - Lambda 表达式允许我们将代码块当作参数传递,简化了匿名...
Java 8是Java编程语言的一个重大更新,引入了许多新的特性和功能,显著提升了开发效率和代码的可读性。这份官方版本的Java8中文API文档是开发者了解和掌握这些新特性的宝贵资源。以下是其中的一些关键知识点: 1. *...
Java 8引入了全新的java.time包,包含了LocalDate、LocalTime、LocalDateTime、ZonedDateTime等类,以及Duration、Period等时间间隔类。这些类提供了更加直观和方便的时间日期操作,如格式化、解析、计算时间差等。 ...
5. **日期和时间API**:Java 8提供了全新的`java.time`包,取代了过时的`java.util.Date`和`java.util.Calendar`,提供了更易于使用的日期和时间类。 6. **默认方法**:接口中可以定义默认方法,它们提供了一个默认...
5. **日期与时间API**:Java8弃用了之前不友好的日期和时间API,引入了新的java.time包,提供了更加直观、强大的日期和时间处理功能,如LocalDate、LocalTime、LocalDateTime等。 6. **Optional类**:Optional是一...