- 一、简介
- 二、关键类
- 三、简单示例
- 四、全部代码
- 六、Java 8日期时间API的重点总结
- java.util.Date 设定为可变类型,以及 SimpleDateFormat 的非线程安全使其应用非常受限
- Java 8 全新的日期时间API基于ISO标准日历系统,java.time包下的所有类都是不可变类型而且线程安全。
- Java 8 全新的日期时间API明确了日期时间概念,例如: 瞬时(instant)、 长短(duration)、 日期、 时间、 时区和 周期。
- Instant:瞬时实例。
- LocalDate:本地日期,不包含具体时间 例如:2014-01-14 可以用来记录生日、纪念日、加盟日等。
- LocalTime:本地时间,不包含日期。
- LocalDateTime:组合了日期和时间,但不包含时差和时区信息。
- ZonedDateTime:最完整的日期时间,包含时区和相对UTC或格林威治的时差。
1. 获取当前的日期
Java 8 中的 LocalDate 用于表示当天日期。和 java.util.Date不同,它只有日期,不包含时间。当你仅需要表示日期时就用这个类。
上面的代码创建了当天的日期,不含时间信息。打印出的日期格式非常友好,不像 Date类 打印出一堆没有格式化的信息。
2.、获取年、月、日信息
LocalDate 提供了获取年、月、日的快捷方法,其实例还包含很多其它的日期属性。通过调用这些方法就可以很方便的得到需要的日期信息,不用像以前一样需要依赖java.util.Calendar类了。
3、处理特定日期
静态工厂方法now()非常容易地创建了当天日期。 工厂方法 LocalDate.of() 创建任意日期, 该方法需要传入年、月、日做参数,返回对应的LocalDate实例。
4、判断两个日期是否相等
LocalDate 重载了equal方法。如果比较的日期是字符型的,需要先解析成日期对象再作判断。
5、检查像生日这种周期性事件
MonthDay类。这个类组合了月份和日,去掉了年,这意味着你可以用它判断每年都会发生事件。 和MonthDay类相似的还有一个 YearMonth类。这些类也都是不可变并且线程安全的值类型。
6、获取当前时间
获取时间使用的是 LocalTime 类,调用静态工厂方法now()来获取当前时间。默认的格式是 hh:mm:ss:nnn。
7、在现有的时间上增加小时
Java 8 提供了更好的 plusHours() 方法替换 add() ,并且是兼容的。注意,这些方法返回一个全新的LocalTime实例,由于其不可变性,返回后一定要用变量赋值。
8、计算一年、一个月、一周、一天后的日期
LocalDate日期不包含时间信息,它的plus()方法用来增加天、周、月, ChronoUnit类声明了这些时间单位。可以用同样的方法增加1个月、1年、1小时、1分钟。
9、计算一年、一个月、一周、一天前的日期
通过 LocalDate 的 plus() 方法增加天数、周数或月数,这个例子我们利用 minus() 方法减少天数、周数或月数。
10、使用Java 8的Clock时钟类
Java 8增加了一个 Clock 时钟类用于获取当时的时间戳,或当前时区下的日期时间信息。以前用到System.currentTimeInMillis() 和 TimeZone.getDefault() 的地方都可用Clock替换。
11、判断日期是早于还是晚于另一个日期
LocalDate 类有两类方法 isBefore() 和 isAfter() 用于比较日期。调用 isBefore() 方法时,如果给定日期小于当前日期则返回 true。
12、处理时区
Java 8不仅分离了日期和时间,也把时区分离出来了。现在有一系列单独的类如 ZoneId 来处理特定时区,ZoneDateTime 类来表示某时区下的时间。
13、如何体现出固定日期
YearMonth 用于表示信用卡到期日、FD到期日、期货期权到期日等。 还可以用这个类得到 当月共有多少天,YearMonth 实例的 lengthOfMonth() 方法可以返回当月的天数,在判断2月有28天还是29天时非常有用。
14、检查闰年
LocalDate类有的方法 isLeapYear() 判断该实例是否是一个闰年
15、计算两个日期之间的天数和月数
有一个常见日期操作是计算两个日期之间的天数、周数或月数。在Java 8中可以用java.time.Period类来做计算。
16、获取当前的时间戳
Instant类有一个静态工厂方法now()会返回当前的时间戳。
17、使用预定义的格式化工具去解析或格式化日期
Java 8引入了全新的日期时间格式工具,线程安全而且使用方便。如下例子中使用了BASICISODATE格式化工具将2020年5月15日格式化成20200515。
package com.rf.localdate;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.Date;
/**
* @description:
* @author: xiaozhi
* @create: 2020-05-15 20:39
*/
public class Test {
public static void main(String[] args) {
// getCurrentDate();
//getYearMonthDayDate();
//handleSpecilDate();
//compareDate();
//cycleDate();
//getCurrentTime();
//plusHours();
//nextDate();
//previousDate();
//clock();
//isBeforeOrIsAfter();
//getZoneTime();
//checkCardExpiry();
//isLeapYear();
//calcDateDays();
//getTimestamp();
formateDate();
}
//获取当前日期
public static void getCurrentDate(){
LocalDate localDate = LocalDate.now();
System.out.println("当前日期:"+localDate);
//作为对比
Date date = new Date();
System.out.println(date);
}
//获取年、月、日信息
public static void getYearMonthDayDate(){
LocalDate localDate = LocalDate.now();
int year = localDate.getYear();
int month = localDate.getMonthValue();
int day = localDate.getDayOfMonth();
System.out.println("年:"+year+",月:"+month+",日:"+day);
}
//处理特定日期
public static void handleSpecilDate(){
LocalDate localDate=LocalDate.of(2020,5,15);
System.out.println("特定日期: " + localDate);
}
//判断两个日期是否相等
public static void compareDate(){
LocalDate now = LocalDate.now();
LocalDate date = LocalDate.of(2020, 5, 15);
if(now.equals(date)){
System.out.println("now和date的日期相等");
}else{
System.out.println("now和date的日期不相等");
}
}
//处理周期性的日期
public static void cycleDate(){
LocalDate today = LocalDate.now();
LocalDate dateOfBirth = LocalDate.of(2020, 05, 15);
MonthDay birthday = MonthDay.of(dateOfBirth.getMonth(), dateOfBirth.getDayOfMonth());
MonthDay currentMonthDay = MonthDay.from(today);
if(currentMonthDay.equals(birthday)){
System.out.println("祝你生日快乐");
}else{
System.out.println("今天不是你的生日");
}
}
//获取当前时间
public static void getCurrentTime(){
LocalTime localTime = LocalTime.now();
System.out.println("当前时间=" + localTime);
}
//增加小时
public static void plusHours(){
LocalTime time = LocalTime.now();
LocalTime newTime = time.plusHours(1); // 增加1小时
System.out.println("当前时间="+time);
System.out.println("当前时间基础上增加1小时= " + newTime);
}
//计算一年、一个月、一周、一天后的日期
public static void nextDate(){
LocalDate today = LocalDate.now();
LocalDate nextYear = today.plus(1, ChronoUnit.YEARS); //使用变量赋值
LocalDate nextMonth = today.plus(1, ChronoUnit.MONTHS); //使用变量赋值
LocalDate nextWeek = today.plus(1, ChronoUnit.WEEKS); //使用变量赋值
LocalDate nextDay = today.plus(1, ChronoUnit.DAYS); //使用变量赋值
System.out.println("当前时间= " + today);
System.out.println("一年之后的时间= " + nextYear);
System.out.println("一个月之后的时间= " + nextMonth);
System.out.println("一周之后的时间= " + nextWeek);
System.out.println("一天之后的时间= " + nextDay);
}
//计算一年、一个月、一周、一天前的日期
public static void previousDate(){
LocalDate today = LocalDate.now();
LocalDate previousYear = today.minus(1, ChronoUnit.YEARS);
LocalDate previousMonth = today.minus(1, ChronoUnit.MONTHS);
LocalDate previousWeeks = today.minus(1, ChronoUnit.WEEKS);
LocalDate previousDay = today.minus(1, ChronoUnit.DAYS);
System.out.println("当前时间= " + today);
System.out.println("一年之前的时间= " + previousYear);
System.out.println("一个月之前的时间= " + previousMonth);
System.out.println("一周之前的时间= " + previousWeeks);
System.out.println("一天之前的时间= " + previousDay);
}
//时钟类
public static void clock(){
// 根据系统时间返回当前时间并设置为UTC。
Clock clock = Clock.systemUTC();
System.out.println(clock);
// 根据系统时钟区域返回时间
Clock defaultClock = Clock.systemDefaultZone();
System.out.println(defaultClock);
}
//java判断日期是早于还是晚于另一个日期
public static void isBeforeOrIsAfter(){
LocalDate today = LocalDate.now();
System.out.println("当前日期="+today);
LocalDate tomorrow = LocalDate.of(2020, 5, 16);
System.out.println("明天日期="+tomorrow);
if(tomorrow.isAfter(today)){
System.out.println("明天是在今天之后");
}
//减去一天
LocalDate yesterday = today.minus(1, ChronoUnit.DAYS);
System.out.println("昨天日期="+yesterday);
if(yesterday.isBefore(today)){
System.out.println("昨天是在今天之前");
}
}
//获取特定时区下面的时间
public static void getZoneTime(){
//设置时区
ZoneId asia = ZoneId.of("Asia/Shanghai");
System.out.println("当前时区="+asia);
//设置当前日期和时间
LocalDateTime localtDateAndTime = LocalDateTime.now();
System.out.println("当前日期和时间="+localtDateAndTime);
ZonedDateTime dateAndTimeInNewYork = ZonedDateTime.of(localtDateAndTime, asia);
System.out.println("现在的日期和时间在特定的时区 =" + dateAndTimeInNewYork);
}
//使用 YearMonth类处理特定的日期
public static void checkCardExpiry(){
YearMonth currentYearMonth = YearMonth.now();
System.out.println("当前年份和月份="+currentYearMonth);
System.out.println("当前月份有多少天="+currentYearMonth.lengthOfMonth());
YearMonth creditCardExpiry = YearMonth.of(2025, Month.JUNE);
System.out.println("指定你的信用卡到期时间="+creditCardExpiry);
}
//检查闰年
public static void isLeapYear(){
LocalDate today = LocalDate.now();
System.out.println("当前日期="+today);
if(today.isLeapYear()){
System.out.println("2020年是闰年");
}else {
System.out.println("2020年不是是闰年");
}
}
//计算两个日期之间的天数和月数
public static void calcDateDays(){
LocalDate today = LocalDate.now();
System.out.println("当前日期="+today);
LocalDate localDate = LocalDate.of(2020, Month.JULY, 25);
System.out.println("指定的日期="+localDate);
Period periodDate = Period.between(today, localDate);
System.out.println("日期相差的年数= " + periodDate.getYears() );
System.out.println("日期相差的月数= " + periodDate.getMonths() );
System.out.println("日期相差的天数= " + periodDate.getDays() );
}
//获取当前的时间戳
public static void getTimestamp(){
Instant timestamp = Instant.now();
System.out.println("当前的时间戳= " + timestamp);
}
// 使用预定义的格式化工具去解析或格式化日期
public static void formateDate(){
String dayAfterTommorrow = "20200515";
LocalDate formatted = LocalDate.parse(dayAfterTommorrow, DateTimeFormatter.BASIC_ISO_DATE);
System.out.print("格式化后的日期="+formatted);
}
}
六、Java 8日期时间API的重点总结
- 提供了javax.time.ZoneId 获取时区。
- 提供了LocalDate和LocalTime类。
- Java 8 的所有日期和时间API都是不可变类并且线程安全,而现有的Date和Calendar API中的java.util.Date和SimpleDateFormat是非线程安全的。
- 主包是 java.time,包含了表示日期、时间、时间间隔的一些类。里面有两个子包java.time.format用于格式化, java.time.temporal用于更底层的操作。
- 时区代表了地球上某个区域内普遍使用的标准时间。每个时区都有一个代号,格式通常由区域/城市构成(Asia/Tokyo),在加上与格林威治或 UTC的时差。例如:东京的时差是+09:00。