`
357029540
  • 浏览: 725476 次
  • 性别: 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);

 

 

分享到:
评论

相关推荐

    java和java8特性功能.rar

    Java 8引入了许多新的功能和改进,包括Lambda表达式、接口默认方法、函数式接口、流API、Date/Time API、Nashorn JavaScript引擎等。这些新功能和改进使得Java编程变得更加简单、直观和高效,并提升了JVM的性能和...

    Java 8 新特性.rar

    jdk1.8的新特性,包括Lambda 表达式,方法引用 默认方法,新工具,Stream API,Date Time API,Optional 类,Nashorn, JavaScript 引擎

    Java 高级特性.doc

    以上的一些程序代码均为张老师课堂即兴发挥所写,也可以看出,张老师对JAVA特性的深刻理解能力!现在说说我对这些程序代码的理解,说实话,才开始听张老师讲的时候,我感觉很模糊的,但是当我真正理解了之后,觉得...

    java8新特性教程之time包使用总结

    Java8新增了date和time的util包,下面这篇文章主要给大家介绍了关于java8新特性教程之time包使用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小...

    jdk8新特性例子

    Jdk8新特性例子,内容包含 接口默认方法, 函数引用, java.util.stream api 和java.time api map的新增方法等。例子采用记事本编写,下载者需自行下载jdk8安装并配置好环境,编译(javac)运行(java)

    Java新特性.pptx

    新特性总览 接口默认方法和静态方法 Lambda 表达式 函数式接口 方法引用 Stream Optional Date/Time API 重复注解 扩展注解的支持 Base64 JavaFX 其它

    Java 8 新特性,一篇通俗易懂的文章

    - 代码更少(增加了新的语法:==Lambda表达式==) - 强大的==Stream API== - **Date Time API** − 加强对日期与时间的处理 - 便于并行 - 最大化减少空指针的异常: **Optional类** - Nashorn 引擎,允许在JVM上运行...

    Jdk新特性教程吐血整理干货.md

    新的时间API(java.time强烈推荐使用) 内置Base64工具 Jdk9新特性 PS: jdk9应该是继jdk8之后,又一个重要的版本,后续jdk的迭代,都是基于jdk9来完成的。 模块化: 模块化是jdk9或者说jdk8之后最大的改进,在jdk8及...

    详解Java8 新特性之日期API

    Java 8 在包java.time下包含了一组全新的时间日期API。下面通过示例给大家讲解java8 新特征日期api的相关知识,感兴趣的朋友一起看看吧

    深入Java虚拟机(原书第2版).pdf【附光盘内容】

    第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

    JDK(Java Development Kit)1.8是Java平台的一个版本,也被称为Java 8。下面是关于JDK 1.8的一些介绍: 1. Lambda表达式:JDK 1.8引入了Lambda表达式,这是一种函数式编程的特性,使得开发人员能够以更简洁的方式...

    java8源码-java8:java8笔记和代码示例

    java8新特性 Stream Api Lambda 表达式 行为参数化 接口中的默认方法 Date Time Api Optional 类 Stream 和 Collection的区别 Stream 描述对数据的计算 Collection 存储和访问数据 行为参数化 让方法接受多种行为...

    java8源码-jdk8:Java8(又称为jdk1.8)是Java语言开发的一个主要版本。Oracle公司于2014年3月18日发布Java

    java8 源码 Java8 Java 8 (又称为 jdk 1.8) 是 Java 语言开发的一个主要版本。 Oracle 公司于 2014 年 3 月 18 日发布 Java 8 ,它支持函数式编程,新的 JavaScript 引擎,新的日期 API,新的Stream API 等。 Java8 ...

    mac os jdk8

    Java8 新增了非常多的特性,我们主要讨论以下几个: Lambda 表达式 − Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中。 方法引用 − 方法引用提供了非常有用的语法,可以直接引用已有Java类或对象...

    Windows JDK8 官方版本

    显著增加和完善Java语言特性,增添标准库,包括默认方法,新的java.util.stream包及 Date-Time API; Compact Profiles包含 Java SE平台预定义子集,使程序员无需部署在整个平台,可运行在小型设备上; 安全性包括...

    WebLogic Real Time简介

    BEA WebLogic Real Time (WLRT)服务器提供了一种基于Java的基础架构来满足实时处理需求。这在Java领域中是比较少见的:按照实时需求处理请求,而不是...在文章的末尾,我们将简要介绍与WebLogic Real Time相关的用例。

    JAVA中的1.8新特性-质问老程序员你确定你看得懂java代码吗?

    java8于2014年发布,相比于java7,java8新增了非常多的特性,如lambda表达式、函数式接口、方法引用、默认方法、新工具(编译工具)、Stream API、Date Time API、Optional等 。 当前很多公司的老产品依然使用的java...

Global site tag (gtag.js) - Google Analytics