`
357029540
  • 浏览: 735705 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

java8新特性time类相关介绍

    博客分类:
  • JAVA
阅读更多

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

 

 

分享到:
评论

相关推荐

    Java8 新特性

    6. **日期与时间API**:Java8改进了日期和时间的处理,引入了新的java.time包,包含了LocalDate、LocalTime、LocalDateTime、ZonedDateTime等类,提供了更强大且易于使用的日期和时间操作。 7. **Optional类**:...

    java8新特性

    Java 8是Java编程语言的一个重大更新,引入了许多新的特性和功能,极大地提高了开发效率和代码的可读性。以下是一些主要的Java 8新特性详解: 1. **Lambda表达式**:这是Java 8最显著的新特性之一,它为Java引入了...

    尚硅谷Java8新特性下载

    Java 8引入了一个新的包`java.time`,它包含了用于日期时间处理的新类,如`LocalDate`、`LocalTime`和`LocalDateTime`等。这些类解决了旧日期时间API(如`Date`和`Calendar`)的一些问题,并提供了更现代的时间日期...

    JAVA8新特性讲解

    以下是关于Java 8新特性的详细讲解: 1. **函数式编程:Lambda表达式** Lambda表达式是Java 8中最显著的新特性,它允许我们将函数作为一个方法参数,或者以匿名函数的形式创建。Lambda表达式简洁且易于理解,使得...

    删减版Java新特性(剖析Java8以来的新特性).pdf

    自 Java 8 发布后,Java 有了许多显著的新特性,极大地提升了开发效率和代码质量。以下是对 Java 8 及之后版本主要新特性的深入剖析: 1. **Lambda 表达式**: Java 8 引入了 Lambda 表达式,使得函数式编程成为...

    Java8-JDK8-新特性学习

    以下将详细讲解Java 8的一些核心新特性: 1. **lambda表达式**:这是Java 8最显著的特征之一。Lambda表达式允许开发者以简洁的方式定义匿名函数,使得函数式编程在Java中变得更加便捷。例如,可以使用`()->System....

    Java 8新特性终极指南

    Java 8 是一个里程碑式的版本,它引入了许多重要的新特性,极大地改变了Java的编程范式。以下是关于Java 8新特性的详细说明: 1. **Lambda表达式与Functional接口** Lambda表达式是Java 8最显著的特性之一,它允许...

    java8新特性导师讲授精简版

    在本精简版的Java 8新特性导师讲授中,我们将重点关注四大核心概念:Lambda表达式、Stream流、方法引用以及一些其他相关的重要更新。 1. Lambda表达式: Lambda表达式是Java 8中最引人注目的特性之一,它为函数式...

    时间日期工具类(包含java8新特性).zip

    在这个"时间日期工具类(包含java8新特性).zip"压缩包中,我们有两个文件:DateUtil.java和DateUtils.java,它们很可能是自定义的工具类,用来扩展Java的标准日期处理功能。 首先,我们来看Java 8引入的新特性。在...

    java8的新特性.doc

    Java 8 是一个重要的版本更新,引入了许多新特性,极大地提升了开发效率和代码的可读性。以下将详细讲解其中的一些关键特性。 1. **Lambda 表达式**: - Lambda 表达式允许我们将代码块当作参数传递,简化了匿名...

    官方版本-Java8-中文版-API(帮助你快速了解Java8新特性)

    Java 8是Java编程语言的一个重大更新,引入了许多新的特性和功能,显著提升了开发效率和代码的可读性。这份官方版本的Java8中文API文档是开发者了解和掌握这些新特性的宝贵资源。以下是其中的一些关键知识点: 1. *...

    Java8 新特性.zip

    Java 8引入了全新的java.time包,包含了LocalDate、LocalTime、LocalDateTime、ZonedDateTime等类,以及Duration、Period等时间间隔类。这些类提供了更加直观和方便的时间日期操作,如格式化、解析、计算时间差等。 ...

    667.665.JAVA基础教程_动态代理与Java8新特性-Java8新特性的好处(667).rar

    5. **日期和时间API**:Java 8提供了全新的`java.time`包,取代了过时的`java.util.Date`和`java.util.Calendar`,提供了更易于使用的日期和时间类。 6. **默认方法**:接口中可以定义默认方法,它们提供了一个默认...

    Java8新特性视频 最新的讲解视频

    5. **日期与时间API**:Java8弃用了之前不友好的日期和时间API,引入了新的java.time包,提供了更加直观、强大的日期和时间处理功能,如LocalDate、LocalTime、LocalDateTime等。 6. **Optional类**:Optional是一...

Global site tag (gtag.js) - Google Analytics