目录
前言:
一、JDK8新增日期类
二、LocalDate,LocalTime,LocalDateTime
三、Instant时间戳
四、DateTimeFormatter类
五、Duration/Period类
六、ChronoUnit类
前言:
JDK 8中增加了一套全新的日期时间API,这套API设计合理,是线程安全的。新的日期及时间API位于 java.time 包 中,下面是一些关键类。
- LocalDate :表示日期,包含年月日,格式为 2019-10-16
- LocalTime :表示时间,包含时分秒,格式为 16:38:54.158549300
- LocalDateTime :表示日期时间,包含年月日,时分秒,格式为 2018-09-06T15:33:56.750
- DateTimeFormatter :日期时间格式化类。
- Instant:时间戳,表示一个特定的时间瞬间。
- Duration:用于计算2个时间(LocalTime,时分秒)的距离
- Period:用于计算2个日期(LocalDate,年月日)的距离
- ZonedDateTime :包含时区的时间
Java中使用的历法是ISO 8601日历系统,它是世界民用历法,也就是我们所说的公历。平年有365天,闰年是366 天。此外Java 8还提供了4套其他历法,分别是:
- ThaiBuddhistDate:泰国佛教历
- MinguoDate:中华民国历
- JapaneseDate:日本历
- HijrahDate:伊斯兰历
一、JDK8新增日期类
概述:
从JDK8开始,java.time包提供了新的日期和时间API,主要涉及的类型有:
新增的API严格区分了时刻,本地日期,本地时间,并且,对日期和时间进行运算更加方便。
其次,新API的类型几乎全部是不可变类型(和String的使用类似),可以放心使用不必担心被修改。
二、LocalDate,LocalTime,LocalDateTime
1.概述:
它们分别表示日期,时间,日期时间对象,它们的类的实例是不可变的对象。
它们三者构建对象和API都是通用的。
2.构建对象的方法如下:
3.修改相关的API
①LocalDate综合了LocalDate和LocalTime里面的方法,所以下面只用LocalDate和LocalTime来举例。
②这些方法返回的是一个新的实例引用,因为LocalDateTime,LocalDate,LocalTime都是不可变的。
4.代码演示:
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import static java.time.LocalTime.of;
/**
* 从JDK8开始新增日期类(java.time包)
* 1、localDate :不包含具体时间的日期(年月日)
* 2、localTime : 不包含日期的时间(时分秒)
* 3、localDateTime :包含了日期及时间(年月日时分秒)
* 4、Instant :代表的是时间戳
* 5、DateTimeFormatter 用于做时间的格式化和解析的
* 6、Duration :用于计算两个时间间隔
* 7、period :用于计算两个日期间隔
* *新API严格区分了时刻、本地日期、本地时间。
*
* 构建对象的方式:
* 1、public static XXXX now(); 静态方法,根据当前时间创建对象
* 例如:LocaDate LocaDate = LocaDate.now();
* 2、public static XXXX of(...); 静态方法,指定日期/时间创建对象
* 例如:LocaDate LocaDate = LocaDate.of(2009,11,11);
*
* 修改相关API:
* plusDays,plusWeeks,plusMonths,plusYears :向当前LocalDate对象添加几天、几周、几月、几年。
* minusDays,minusWeeks,minusMonths,minusYears :从当前LocalDate对象减去几天、几周、几月、几年。
* withDayOfMonth,withDayOfYear,withDayOfMonth,withYear :将月份天数、年份天数、月份、年份修改为指定的值并返回新的localDate对象
* isBefore,isAfter :比较两个LocalDate
*/
public class time_Test {
public static void main(String[] args) {
LocalTime nowTime = LocalTime.now();
System.out.println(nowTime);
System.out.println(nowTime.minusHours(1));//一个小时前
System.out.println(nowTime.plusHours(1));//一个小时后
System.out.println("-----------------------");
LocalTime myDate = of(2018,9,5);
LocalTime nowDate = LocalTime.now();
System.out.println("今天是2018-09-06吗?" + nowDate.equals(myDate));
System.out.println(myDate+"是否在"+nowDate+"之前?"+myDate.isBefore(nowDate));
System.out.println(myDate+"是否在"+nowDate+"之后?"+myDate.isAfter(nowDate));
System.out.println("-------------------");
//判断今天是否是你的生日?
LocalDate birDate = LocalDate.of(2002,12,12);
LocalDate nowDate1 = LocalDate.now();
MonthDay birMD = MonthDay.of(birDate.getMonthValue(),birDate.lengthOfMonth());
MonthDay nowMD = MonthDay.from(nowDate1);
System.out.println("今天是你的生日吗?"+birMD.equals(nowMD));
//时间戳:Instant
Instant instant = Instant.now();
System.out.println("当前时间戳是:"+instant);
Date date = Date.from(instant);
System.out.println("当前时间戳是:"+date);
instant = date.toInstant();
System.out.println(instant);
// DateTimeFormatter 用于做时间的格式化和解析的
LocalDateTime ldt = LocalDateTime.now();
System.out.println(ldt);
// 解析/格式化器
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss EEE a");
//正向格式化 :格式化器格式日期
System.out.println(dtf.format(ldt));
//逆向格式化 : 日期格式 格式化器
System.out.println(ldt.format(dtf));
//解析字符串时间
DateTimeFormatter dtf1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String dateStr ="2019-11-12 11-11-11";
//解析当前字符串成为本地日期时间对象
LocalDateTime ldt1 = LocalDateTime.parse("2019-11-12 11:11:11",dtf1);
System.out.println(ldt1);
System.out.println(ldt1.getDayOfYear());
//period :用于计算两个日期间隔 ,只能精确到年月日(java.time.period)
//当前年月日
LocalDate today=LocalDate.now();
System.out.println(today);
//生日的年月日
LocalDate birthDate = LocalDate.of(1998,10,12);
System.out.println(birthDate);
Period period = Period.between(birthDate,today);
System.out.println(period.getYears());
System.out.println(period.getMonths());
System.out.println(period.getDays());
//Duration :用于计算两个时间间隔
LocalDateTime today1 =LocalDateTime.now();
System.out.println(today1);
//生日的年月日
LocalDateTime birthDate1 = LocalDateTime.of(1998,10,12,20,00,00);
System.out.println(birthDate1);
Duration duration = Duration.between(today1,birthDate1);//第二个参数减第一个参数
System.out.println(duration.toDays());//两个时间的天数
System.out.println(duration.toHours());//两个时间差的小时数
System.out.println(duration.toMinutes());//两个时间差的分钟数
System.out.println(duration.toMillis());//两个时间差的毫秒数
System.out.println(duration.toNanos());//两个时间差的秒数
}
}
三、Instant时间戳
1.概述:
JDK8获取时间戳特别简单,且功能更丰富。Instant类由一个静态的工厂方法now()可以返回当前时间戳。
时间戳是包含日期和时间的,与java.util.Date很类似,事实上Instant就是类似JDK8以前的Date。
Instant和Date这两个类可以进行转换。
2.代码演示:
import java.time.Instant;
import java.time.ZoneId;
import java.util.Date;
public class Instant_Test {
public static void main(String[] args) {
//时间戳:Instant
Instant instant = Instant.now();
System.out.println("当前时间戳是:"+instant);
Date date = Date.from(instant);
System.out.println("当前时间戳是:"+date);
instant = date.toInstant();
System.out.println(instant);
//2.系统此刻的时间戳怎么办?
Instant instant1 = Instant.now();
System.out.println(instant1.atZone(ZoneId.systemDefault()));
//3.如何转成Date对象
Date date1 = Date.from(instant);
System.out.println("当前时间戳是:"+date);
}
}
四、DateTimeFormatter类
1.概述:
在JDK8中,引入了一个全新的日期与时间格式器DateTimeFormatter。
正反都能调用format方法。
2.代码演示:
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class DateTmeFormatter_Test {
public static void main(String[] args) {
// DateTimeFormatter 用于做时间的格式化和解析的
LocalDateTime ldt = LocalDateTime.now();
System.out.println(ldt);
// 解析/格式化器
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss EEE a");
//正向格式化 :格式化器格式日期
System.out.println(dtf.format(ldt));
//逆向格式化 : 日期格式 格式化器
System.out.println(ldt.format(dtf));
//解析字符串时间
DateTimeFormatter dtf1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String dateStr ="2019-11-12 11-11-11";
//解析当前字符串成为本地日期时间对象
LocalDateTime ldt1 = LocalDateTime.parse("2019-11-12 11:11:11",dtf1);
System.out.println(ldt1);
System.out.println(ldt1.getDayOfYear());
}
}
五、Duration/Period类
1.Period概述:
在java8中,我们可以使用以下类来计算日期间隔差异:java.time.Period
主要是Period类方法getYear(),getMonths()和getDays()来计算,只能精确到年月日。
用于LocalDate之间的比较。
2.代码演示:
import java.time.LocalDate;
import java.time.Period;
public class Period_Test {
public static void main(String[] args) {
//period :用于计算两个日期间隔 ,只能精确到年月日(java.time.period)
//当前年月日
LocalDate today =LocalDate.now();
System.out.println(today);
//生日的年月日
LocalDate birthDate = LocalDate.of(1998,10,12);
System.out.println(birthDate);
Period period = Period.between(birthDate,today);
System.out.println(period.getYears());
System.out.println(period.getMonths());
System.out.println(period.getDays());
}
}
3.Duration概述:
在java8中,我们可以使用以下类来计算日期间隔差异:java.time.Duration
提供了使用基于时间的值测量时间量的方法。
用于LocalDateTime之间的比较,也可用于Instant之间的比较。
4.代码演练:
import java.time.Duration;
import java.time.LocalDateTime;
public class Duration_Test {
public static void main(String[] args) {
//Duration :用于计算两个时间间隔
LocalDateTime today1 =LocalDateTime.now();
System.out.println(today1);
//生日的年月日
LocalDateTime birthDate1 = LocalDateTime.of(1998,10,12,20,00,00);
System.out.println(birthDate1);
Duration duration = Duration.between(birthDate1,today1);//第二个参数减第一个参数
System.out.println(duration.toDays());//两个时间的天数
System.out.println(duration.toHours());//两个时间差的小时数
System.out.println(duration.toMinutes());//两个时间差的分钟数
System.out.println(duration.toMillis());//两个时间差的毫秒数
System.out.println(duration.toNanos());//两个时间差的秒数
}
}
六、ChronoUnit类
1.概述:
java.time.temporal.ChronoUnit
ChronoUnit类可用于在单个时间单位内测量一段时间,这个工具类是最全的,可以用于比较所有的时间单位。