JavaSE基础:JDK8日期操作 – 记忆角落

JavaSE基础:JDK8日期操作

/ 1评 / 1

转载:https://juejin.im/post/5a795bad6fb9a0634f407ae5

Java处理日期、日历和时间的方式一直为社区所诟病,将 java.util.Date设定为可变类型,以及SimpleDateFormat的非线程安全使其应用非常受限。
新API基于ISO标准日历系统,java.time包下的所有类都是不可变类型而且线程安全。

编号 类的名称 描述
1 Instant 时间戳
2 Duration 持续时间,时间差
3 LocalDate 只包含日期,比如:2018-02-05
4 LocalTime 只包含时间,比如:23:12:10
5 LocalDateTime 包含日期和时间,比如:2018-02-05 23:14:21
6 Period 时间段
7 ZoneOffset 时区偏移量,比如:+8:00
8 ZonedDateTime 带时区的时间
9 Clock 时钟,比如获取目前美国纽约的时间
10 java.time.format.DateTimeFormatter 时间格式化

Java 8中获取今天的日期

package com.glj.demo;
import java.time.LocalDate;
/**
 * Created with IntelliJ IDEA.
 * User: GuoLiangJun
 * Date: 2020/4/7
 * Time: 9:02
 */
public class Demo1 {
    public static void main(String[] args) {
        //Java 8中获取今天的日期
        LocalDate today = LocalDate.now();
        //today:2020-04-07
        System.out.println("today:"+today);
    }
}

Java 8中获取年、月、日信息

package com.glj.demo;

import java.time.LocalDate;

/**
 * Created with IntelliJ IDEA.
 * User: GuoLiangJun
 * Date: 2020/4/7
 * Time: 9:19
 */
public class Demo2 {
    public static void main(String[] args) {
        //Java 8中获取年、月、日信息
        LocalDate today = LocalDate.now();
        int year = today.getYear();
        int month = today.getMonthValue();
        int day = today.getDayOfMonth();
        System.out.println("year:"+year);
        System.out.println("month:"+month);
        System.out.println("day:"+day);
    }
}

Java 8中处理特定日期

调用LocalDate.of()方法创建任意日期,该方法需要传入int类型的年、月、日做参数,返回对应的LocalDate实例。这个方法的好处是没再犯老API的设计错误,比如年度起始于1900,月份是从0开 始等等。

package com.glj.demo;

import java.time.LocalDate;

/**
 * Created with IntelliJ IDEA.
 * User: GuoLiangJun
 * Date: 2020/4/7
 * Time: 9:40
 */
public class Demo3 {
    //示例:Java 8中处理特定日期
    //调用LocalDate.of()方法创建任意日期,
    // 该方法需要传入int类型的年、月、日做参数,
    // 返回对应的LocalDate实例。
    // 这个方法的好处是没再犯老API的设计错误,比如年度起始于1900,月份是从0开 始等等。
    public static void main(String[] args) {
        LocalDate date  = LocalDate.of(2020,2,12);
        System.out.println("date:"+date);
    }
}

Java 8中判断两个日期是否相等

package com.glj.demo;

import java.time.LocalDate;

/**
 * Created with IntelliJ IDEA.
 * User: GuoLiangJun
 * Date: 2020/4/7
 * Time: 10:00
 */
public class Demo4 {
    // Java 8中判断两个日期是否相等
    public static void main(String[] args) {
        LocalDate today = LocalDate.now();
        LocalDate date = LocalDate.of(2020,02,02);
        if(today.equals(date)){
            System.out.println("相等");
        }else{
            System.out.println("不相等");
        }
    }
}

Java 8中获取当前时间

package com.glj.demo;

import java.time.LocalTime;

/**
 * Created with IntelliJ IDEA.
 * User: GuoLiangJun
 * Date: 2020/4/7
 * Time: 10:10
 */
public class Demo5 {
    public static void main(String[] args) {
        LocalTime time = LocalTime.now();
        System.out.println("获取当前的时间,不含有日期:"+time);
    }
}

Java 8中获取当前时间

通过增加小时、分、秒来计算将来的时间很常见。Java 8除了不变类型和线程安全的好处之外,还提供了更好的plusHours()方法替换add(),并且是兼容的。注意,这些方法返回一个全新的LocalTime实例,由于其不可变性,返回后一定要用变量赋值。

package com.glj.demo;

import java.time.LocalTime;

/**
 * Created with IntelliJ IDEA.
 * User: GuoLiangJun
 * Date: 2020/4/7
 * Time: 10:10
 */
public class Demo6 {
    public static void main(String[] args) {
        //Java 8中获取当前时间
        //通过增加小时、分、秒来计算将来的时间很常见。Java 8除了不变类型和线程安全的好处之外,还提供了更好的plusHours()方法替换add(),并且是兼容的。注意,这些方法返回一个全新的LocalTime实例,由于其不可变性,返回后一定要用变量赋值。
        LocalTime time = LocalTime.now();
        LocalTime newTime = time.plusHours(3);
        System.out.println("三个小时后的时间为:"+newTime);
    }
}

Java 8如何计算一周后的日期

LocalDate日期不包含时间信息,它的plus()方法用来增加天、周、月,ChronoUnit类声明了这些时间单位。由于LocalDate也是不变类型,返回后一定要用变量赋值。

package com.glj.demo;

import java.time.LocalDate;
import java.time.temporal.ChronoUnit;

/**
 * Created with IntelliJ IDEA.
 * User: GuoLiangJun
 * Date: 2020/4/7
 * Time: 11:09
 */
public class Demo7 {
    public static void main(String[] args) {
        //Java 8如何计算一周后的日期
        //LocalDate日期不包含时间信息,它的plus()方法用来增加天、周、月,ChronoUnit类声明了这些时间单位。由于LocalDate也是不变类型,返回后一定要用变量赋值。
        LocalDate today = LocalDate.now();
        System.out.println("今天的日期为:"+today);
        LocalDate nextWeek = today.plus(1, ChronoUnit.WEEKS);
        System.out.println("一周后的日期为:"+nextWeek);
    }
}

Java 8计算一年前或一年后的日期

利用minus()方法计算一年前的日期.

package com.glj.demo;

import java.time.LocalDate;
import java.time.temporal.ChronoUnit;

/**
 * Created with IntelliJ IDEA.
 * User: GuoLiangJun
 * Date: 2020/4/7
 * Time: 11:10
 */
public class Demo8 {
    public static void main(String[] args) {
        //Java 8计算一年前或一年后的日期
        //利用minus()方法计算一年前的日期
        LocalDate today = LocalDate.now();

        LocalDate previousYear = today.minus(1, ChronoUnit.YEARS);
        System.out.println("一年前的日期 : " + previousYear);

        LocalDate nextYear = today.plus(1, ChronoUnit.YEARS);
        System.out.println("一年后的日期:"+nextYear);
    }
}

Java 8的Clock时钟类

Java 8增加了一个Clock时钟类用于获取当时的时间戳,或当前时区下的日期时间信息。以前用到System.currentTimeInMillis()和TimeZone.getDefault()的地方都可用Clock替换。

package com.glj.demo;

import java.time.Clock;

/**
 * Created with IntelliJ IDEA.
 * User: GuoLiangJun
 * Date: 2020/4/7
 * Time: 11:12
 */
public class Demo9 {
    public static void main(String[] args) {
        //Java 8的Clock时钟类
        //Java 8增加了一个Clock时钟类用于获取当时的时间戳,或当前时区下的日期时间信息。以前用到System.currentTimeInMillis()和TimeZone.getDefault()的地方都可用Clock替换。
        Clock clock = Clock.systemUTC();
        System.out.println("Clock : " + clock.millis());

        Clock defaultClock = Clock.systemDefaultZone();
        System.out.println("Clock : " + defaultClock.millis());
    }
}

用Java判断日期是早于还是晚于另一个日期

在Java 8中,LocalDate类有两类方法isBefore()和isAfter()用于比较日期。调用isBefore()方法时,如果给定日期小于当前日期则返回true。

package com.glj.demo;

import java.time.LocalDate;
import java.time.temporal.ChronoUnit;

/**
 * Created with IntelliJ IDEA.
 * User: GuoLiangJun
 * Date: 2020/4/7
 * Time: 11:13
 */
public class Demo10 {
    public static void main(String[] args) {
        //如何用Java判断日期是早于还是晚于另一个日期
        //在Java 8中,LocalDate类有两类方法isBefore()和isAfter()用于比较日期。调用isBefore()方法时,如果给定日期小于当前日期则返回true。
        LocalDate today = LocalDate.now();

        LocalDate tomorrow = LocalDate.of(2018, 2, 6);
        if (tomorrow.isAfter(today)) {
            System.out.println("之后的日期:" + tomorrow);
        }

        LocalDate yesterday = today.minus(1, ChronoUnit.DAYS);
        if (yesterday.isBefore(today)) {
            System.out.println("之前的日期:" + yesterday);
        }
    }
}

在Java 8中检查闰年 -->isLeapYear()

package com.glj.demo;

import java.time.LocalDate;

/**
 * Created with IntelliJ IDEA.
 * User: GuoLiangJun
 * Date: 2020/4/7
 * Time: 11:15
 */
public class Demo11 {
    public static void main(String[] args) {
        //如何在Java 8中检查闰年 -->isLeapYear()
        LocalDate today = LocalDate.now();
        if(today.isLeapYear()){
            System.out.println("This year is Leap year");
        }else {
            System.out.println("2018 is not a Leap year");
        }
    }
}

计算两个日期之间的天数和月数

有一个常见日期操作是计算两个日期之间的天数、周数或月数。在Java 8中可以用java.time.Period类来做计算。下面这个例子中,我们计算了当天和将来某一天之间的月数。

package com.glj.demo;

import java.time.LocalDate;
import java.time.Period;

/**
 * Created with IntelliJ IDEA.
 * User: GuoLiangJun
 * Date: 2020/4/7
 * Time: 11:16
 */
public class Demo12 {
    public static void main(String[] args) {
        //计算两个日期之间的天数和月数
        //有一个常见日期操作是计算两个日期之间的天数、周数或月数。在Java 8中可以用java.time.Period类来做计算。下面这个例子中,我们计算了当天和将来某一天之间的月数。
        LocalDate today = LocalDate.now();
        LocalDate java8Release = LocalDate.of(2018, 12, 14);
        Period periodToNextJavaRelease = Period.between(today,java8Release);
        System.out.println("Months left between today and Java 8 release : "
                + periodToNextJavaRelease.getMonths() );
    }
}

在Java 8中获取当前的时间戳

Instant类有一个静态工厂方法now()会返回当前的时间戳.

package com.glj.demo;

import java.time.Instant;

/**
 * Created with IntelliJ IDEA.
 * User: GuoLiangJun
 * Date: 2020/4/7
 * Time: 11:18
 */
public class Demo13 {
    public static void main(String[] args) {
        //在Java 8中获取当前的时间戳
        //Instant类有一个静态工厂方法now()会返回当前的时间戳.
        Instant timestamp = Instant.now();
        System.out.println("timestamp:"+timestamp.toEpochMilli());
    }
}
//时间戳信息里同时包含了日期和时间,这和java.util.Date很像。实际上Instant类确实等同于 Java 8之前的Date类,你可以使用Date类和Instant类各自的转换方法互相转换,例如:Date.from(Instant) 将Instant转换成java.util.Date,Date.toInstant()则是将Date类转换成Instant类。

Java 8中如何使用预定义的格式化工具去解析或格式化日期

package com.glj.demo;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

/**
 * Created with IntelliJ IDEA.
 * User: GuoLiangJun
 * Date: 2020/4/7
 * Time: 11:20
 */
public class Demo14 {
    public static void main(String[] args) {
        //Java 8中如何使用预定义的格式化工具去解析或格式化日期
        String dayAfterTommorrow = "20180205";
        LocalDate formatted = LocalDate.parse(dayAfterTommorrow,
                DateTimeFormatter.BASIC_ISO_DATE);
        System.out.println("formatted:"+formatted);
    }
}

字符串互转日期类型

package com.glj.demo;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

/**
 * Created with IntelliJ IDEA.
 * User: GuoLiangJun
 * Date: 2020/4/7
 * Time: 11:21
 */
public class Demo15 {
    public static void main(String[] args) {
        LocalDateTime date = LocalDateTime.now();
        DateTimeFormatter format1 = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        //日期转字符串
        String str = date.format(format1);
        System.out.println("日期转换为字符串:"+str);

        DateTimeFormatter format2 = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        LocalDate date2 = LocalDate.parse(str,format2);
        System.out.println("日期类型:"+date2);
    }
}

 

一条回应:“JavaSE基础:JDK8日期操作”

  1. 大雄说道:

    hutool不香吗?

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注