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


hutool不香吗?