JavaSE基础:JDK8日期操作
本文最后更新于 2325 天前,其中的信息可能已经有所发展或是发生改变。

转载: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);
    }
}

Image
Image

 

评论

  1. Image
    Macintosh Chrome 80.0.3987.163
    6 年前
    2020-4-10 0:29:56

    hutool不香吗?

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇