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