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);