java8新特性之 日期和时间

在Java 8以前,日期和时间处理一直被广大java程序员抱怨太难用,java.utiljava.sql中,都包含Date类,如果要进行时间格式化,还需要java.text.DateFormat类处理。同时java.util.Date中既包含了日期,又包含了时间,所以java8新的日期和时间库,很好的解决了以前日期和时间类的很多弊端。并且也借鉴了第三方日期库joda很多的优点。

java.time包下主要包含下面几个主要的类:
Instant:时间戳
Duration:持续时间,时间差
LocalDate:只包含日期,比如:2019-02-02
LocalTime:只包含时间,比如:23:12:10
LocalDateTime:包含日期和时间,比如:2019-02-02 23:14:21
Period:时间段
ZoneOffset:时区偏移量,比如:+8:00
ZonedDateTime:带时区的时间
Clock:时钟,比如获取目前美国纽约的时间

1 获取当天日期

      LocalDate localDate =LocalDate.now();
         System.out.println(localDate);

输出结果为:2019-02-02

2 指定日期,进行相应操作

1)获取某月份的第一天的两种方法

     LocalDate localDate =LocalDate.now(); 
     LocalDate firstDay =  localDate.with(TemporalAdjusters.firstDayOfMonth());
     LocalDate firstDay =  localDate.withDayOfMonth(1);

2)取某月的最后一天 

     LocalDate localDate =LocalDate.now();
        LocalDate lastDay =  localDate.with(TemporalAdjusters.lastDayOfMonth());

3)当前日期+1天

     LocalDate localDate =LocalDate.now();     LocalDate tomorrow =  localDate.plusDays(1);

4)判断是否为闰年

     LocalDate localDate =LocalDate.now();
        boolean aa =localDate.isLeapYear();

5)指定日期

     LocalDate localDate =LocalDate.of(2019,01,01);
        System.out.println(localDate);

3 生日检查或账单检查

我们在购物时注册会员时都会有生日祝福,例如,用户的生日为1996-03-19,如果今天是2018-03-19,那么今天就是用户的生日(按公历/身份证日期来算),那么通过java8新的日期库,我们该如何来进行实现呢?

     LocalDate birthday = LocalDate.of(1996, 03, 19);
        MonthDay birthdayMd = MonthDay.of(birthday.getMonth(), birthday.getDayOfMonth());
        MonthDay today = MonthDay.from(LocalDate.of(2018, 03, 19));
        System.out.println(today.equals(birthdayMd));输出结果为 :true 

4 获取当前时间(不含日期)

     LocalTime localTime =LocalTime.now();
        ////获取当前时间不显示毫秒 10:13:14
        LocalTime localTime1 =LocalTime.now().withNano(0);
        //指定时间
        LocalTime time =LocalTime.of(0,0,20);
        LocalTime time1 =LocalTime.parse("10:20:20");
        //当前时间+2h
        LocalTime add =localTime.plus(1, ChronoUnit.HOURS);
        LocalTime add1 =localTime.plusHours(1);

5 日期前后比较

     LocalDate today = LocalDate.now();
        LocalDate specifyDate = LocalDate.of(2018, 12, 20);
        System.out.println(today.isBefore(specifyDate)); //false
        System.out.println(today.isAfter(specifyDate)); //true 

6 处理不同时间的时间

     //查看当前的时区
        ZoneId defaultZone = ZoneId.systemDefault();
        System.out.println(defaultZone); //Asia/Shanghai
        //查看美国纽约当前的时间
        ZoneId usa = ZoneId.of("America/New_York");
        LocalDateTime shanghai = LocalDateTime.now();
        LocalDateTime usaTime = LocalDateTime.now(usa);
        System.out.println(shanghai); //2019-02-02T10:28:31.471
        System.out.println(usaTime); //2019-02-01T21:28:31.471,可以看到美国与北京时间差了11小时
        //带有时区的时间
        ZonedDateTime americaZoneDateTime = ZonedDateTime.now(defaultZone);
        System.out.println(americaZoneDateTime); //2019-02-02T11:03:05.926+08:00[Asia/Shanghai]

7 比较两个日期之前时间差

     LocalDate today = LocalDate.now();
        LocalDate date = LocalDate.of(2018, 12, 30);
        System.out.println(date.until(today, ChronoUnit.DAYS)); //34

8 日期时间格式化

在java8之前,我们进行时间格式化主要是使用SimpleDateFormat,而在java8中,主要是使用DateTimeFormatter,java8中,预定义了一些标准的时间格式,我们可以直接将时间转换为标准的时间格式

    LocalDateTime dateTime = LocalDateTime.now();    String strDate1 = dateTime.format(DateTimeFormatter.BASIC_ISO_DATE);    // 20190202    String strDate2 = dateTime.format(DateTimeFormatter.ISO_LOCAL_DATE);    // 2019-02-02    String strDate3 = dateTime.format(DateTimeFormatter.ISO_LOCAL_TIME);    // 11:29:43.08    String strDate4 = dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));   // 2019-02-02    String strDate5 = dateTime.format(DateTimeFormatter.ofPattern("今天是:YYYY年 MMMM dd日 E", Locale.CHINESE)); // 今天是:2019年 二月 02日 星期六
     //字符串解析日期对象     String strDate1 = "2019-02-02";    String strDate2 = "2019-02-02 12:30:05";    LocalDate date = LocalDate.parse(strDate1, DateTimeFormatter.ofPattern("yyyy-MM-dd"));//2019-02-02    LocalDateTime dateTime1 = LocalDateTime.parse(strDate2, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));//2019-02-02T12:30:05

但是有些时候标准的时间格式不能满足我们的要求需要我们自定义时间格式

     DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("YYYY年MM月dd日00:00:00");
        System.out.println(dateTimeFormatter.format(LocalDate.now()));//2019年02月02日00:00:00

9 Date类于java8时间类相互转化

在转换中,我们需要注意,因为java8之前Date是包含日期和时间的,而LocalDate只包含日期,LocalTime只包含时间,所以与Date在互转中,必定会丢失日期或者时间,或者会使用起始时间。如果转LocalDateTime,就不存在信息误差。

     //Date与Instant的相互转化
        Instant instant  = Instant.now();
        Date date = Date.from(instant);
        Instant instant2 = date.toInstant();
        System.out.println(instant);//2019-02-02T03:22:18.387Z
        System.out.println(date);//Sat Feb 02 11:22:18 CST 2019
        System.out.println(instant2);//2019-02-02T03:22:18.387Z
     //Date转为LocalDateTime
        Date date2 = new Date();
        LocalDateTime localDateTime2 = LocalDateTime.ofInstant(date2.toInstant(), ZoneId.systemDefault());
        System.out.println(date2);//Sat Feb 02 11:24:24 CST 2019
        System.out.println(localDateTime2);//2019-02-02T11:24:24.213
       //LocalDateTime转Date
        LocalDateTime localDateTime3 = LocalDateTime.now();
        Instant instant3 = localDateTime3.atZone(ZoneId.systemDefault()).toInstant();
        Date date3 = Date.from(instant);
        System.out.println(localDateTime3);//2019-02-02T11:25:38.524
        System.out.println(instant3);//2019-02-02T03:25:38.524Z
        System.out.println(date3);//Sat Feb 02 11:25:38 CST 2019
      //LocalDate转Date,因为LocalDate不包含时间,所以转Date时,会默认转为当天的起始时间,00:00:00
        LocalDate localDate4 = LocalDate.now();
        Instant instant4 = localDate4.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant();
        Date date4 = Date.from(instant);
        System.out.println(localDate4);//2019-02-02
        System.out.println(instant4);//2019-02-01T16:00:00Z
        System.out.println(date4);//Sat Feb 02 11:26:35 CST 2019

原文地址:https://www.cnblogs.com/xiaoxiaoliu/p/10348120.html

时间: 2024-10-06 19:00:03

java8新特性之 日期和时间的相关文章

Java8新特性_日期时间新类 LocalDate、LocalTime、LocalDateTime

import java.text.SimpleDateFormat; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.Exec

Java8新特性浅析

欢迎阅读我编写的Java 8介绍.本教程将带领你一步一步地认识这门语言的新特性.通过简单明了的代码示例,你将会学习到如何使用默认接口方法,Lambda表达式,方法引用和重复注解.看完这篇教程后,你还将对最新推出的API有一定的了解,例如:流控制,函数式接口,map扩展和新的时间日期API等等. 允许在接口中有默认方法实现 Java 8 允许我们使用default关键字,为接口声明添加非抽象的方法实现.这个特性又被称为扩展方法.下面是我们的第一个例子: 1 2 3 4 5 6 7 interfac

乐字节-Java8新特性-接口默认方法之Stream流(下)

接上一篇:<Java8新特性之stream>,下面继续接着讲Stream 5.流的中间操作 常见的流的中间操作,归为以下三大类:筛选和切片流操作.元素映射操作.元素排序操作: 操作 描述 筛选和切片 filter(T -> boolean):保留 boolean 为 true 的元素 limit(long n):返回前 n 个元素 skip(long n):去除前 n 个元素 distinct():去除重复元素,这个方法是通过类的 equals 方法来判断两个元素是否相等的 映射 map

java8 新特性精心整理(全)

前言 越来越多的项目已经使用 Java 8 了,毫无疑问,Java 8 是Java自Java 5(发布于2004年)之后的最重要的版本.这个版本包含语言.编译器.库.工具和 JVM 等方面的十多个新特性.在本文中我们将学习这些新特性,并用实际的例子说明在什么场景下适合使用. 引用:本文参考了这两篇文章,加以自己的理解,整理成一份最容易理解的 Java8 新特性文章,有少部分章节可能内容一致,但绝对不是抄袭,只是为了文章的完整性,大部分常用的地方加了我自己的理解和示例. https://blog.

Java8 新特性之流式数据处理

一. 流式处理简介 在我接触到java8流式处理的时候,我的第一感觉是流式处理让集合操作变得简洁了许多,通常我们需要多行代码才能完成的操作,借助于流式处理可以在一行中实现. 比如我们希望对一个包含整数的集合中筛选出所有的偶数,并将其封装成为一个新的List返回,那么在java8之前,我们需要通过如下代码实现: List<Integer> evens = new ArrayList<>(); for (final Integer num : nums) { if (num % 2 =

Java精品高级课,架构课,java8新特性,P2P金融项目,程序设计,功能设计,数据库设计,第三方支付,web安全,视频教程

36套精品Java架构师,高并发,高性能,高可用,分布式,集群,电商,缓存,性能调优,设计模式,项目实战,P2P金融项目,大型分布式电商实战视频教程 视频课程包含: 高级Java架构师包含:Spring boot.Spring  cloud.Dubbo.Elasticsearch,Redis.ActiveMQ.Nginx.Mycat.Spring.MongoDB.ZeroMQ.Git.Nosql.Jvm.Mecached.Netty.Nio.Mina.java8新特性,P2P金融项目,程序设计,

JAVA8新特性——Lamda表达式

JAVA9都要出来了,JAVA8新特性都没搞清楚,是不是有点掉队哦~ Lamda表达式,读作λ表达式,它实质属于函数式编程的概念,要理解函数式编程的产生目的,就要先理解匿名内部类. 先来看看传统的匿名内部类调用方式: interface MyInterface{ void lMethod(); } public class Main { public static void test(MyInterface myInterface){ myInterface.lMethod(); } publi

JAVA8新特性——接口定义增强

JAVA9都要出来了,JAVA8新特性都没搞清楚,是不是有点掉队哦~ 接口定义增强 在JDK1.8以前,接口是定义的: 接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明.一个类通过继承接口的方式,从而来继承接口的抽象方法. 在JDK1.8之前,接口有如下特性: 接口中每一个方法也是隐式抽象的,接口中的方法会被隐式的指定为 public abstract(只能是 public abstract,其他修饰符都会报错). 接口中

Java8 新特性----函数式接口,以及和Lambda表达式的关系

这里来讲解一下Java8 新特性中的函数式接口, 以及和Lambda 表达式的关系.看到过很多不少介绍Java8特性的文章,都会介绍到函数式接口和lambda表达式,但是都是分别介绍,没有将两者的关系说明清楚,在这里,把自己的理解整理如下: 一.函数式接口: 函数式接口其实本质上还是一个接口,但是它是一种特殊的接口:SAM类型的接口(Single Abstract Method).定义了这种类型的接口,使得以其为参数的方法,可以在调用时,使用一个lambda表达式作为参数.从另一个方面说,一旦我