罗列一下java8中对于日期的一些Api,以便在以后工作或练习中使用。
使用的是LocalDate
、localTime
和LocalDateTime
这三个类对日期进行操作。
需要注意的是LocalDate
、LocalTime
和LocalDateTime
是和String对象一样的,被final修饰,是不可变的。在对LocalDate
或LocalTime
进行操作后需要使用新的LocalDate
、LocalTime
或LocalDateTime
去接收日期处理之后的返回值
package com.mywork.test;
import org.junit.Test;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.Date;
/**
* Java8日期处理
*/
public class Java8Date {
/**
* 获取今天的日期
* LocalDate输出的日期格式为:yyyy-MM-dd
*/
@Test
public void getTodayTime(){
LocalDate today = LocalDate.now();
System.out.println("今天的日期:"+today);
}
/**
* 获取当前日期归属的年、月、日
*/
@Test
public void getYearMonthDay(){
LocalDate today = LocalDate.now();
System.out.println("今天归属的年份:"+today.getYear());
System.out.println("今天归属的月份: "+today.getMonth());
System.out.println("今天归属几号: "+today.getDayOfMonth());
}
/**
* 自定义创建日期
*/
@Test
public void initDate(){
LocalDate day = LocalDate.of(2018,3,3);
System.out.println("自定义初始化的日期: "+day);
}
/**
* 判断日期是否相等
*/
@Test
public void equalsDay(){
LocalDate date1 = LocalDate.now();
LocalDate date2 = LocalDate.of(2018,3,3);
System.out.println(date1.equals(date2));
}
/**
* 判断是否是周期性的日期(例如每年的生日)
*/
@Test
public void isPeriodicDay(){
LocalDate today = LocalDate.now();
LocalDate target = LocalDate.of(2018,2,25);
MonthDay monthDay = MonthDay.of(target.getMonth(),target.getDayOfMonth()); //获取源目标日期的月份和号
MonthDay todayOfMonthDay = MonthDay.from(today); //获取到当前日期的月份和号
System.out.println(monthDay.equals(todayOfMonthDay));
}
/**
* 获取到当前时间(不含日期),精度超过毫秒级别
*/
@Test
public void getNowTime(){
LocalTime nowTime = LocalTime.now();
System.out.println(nowTime);
}
/**
* 时间加减计算,使用ChronoUnit对象,里面有时、分、秒 的单位
*/
@Test
public void calculateTime(){
LocalTime nowTime = LocalTime.now();
System.out.println("3小时前的时间:"+nowTime.minus(3,ChronoUnit.HOURS));
System.out.println("3小时后的时间:"+nowTime.plus(3,ChronoUnit.HOURS));
System.out.println("3分钟前的时间:"+nowTime.minus(3,ChronoUnit.MINUTES));
System.out.println("3秒前的时间:"+nowTime.minus(3,ChronoUnit.SECONDS));
}
/**
*日期计算,使用ChronoUnit对象,里面有年、月、日、周的单位
*/
@Test
public void calculateDate(){
LocalDate today = LocalDate.now();
//使用负数计算以前的时间
System.out.println("一周前的日期:"+today.plus(-1, ChronoUnit.WEEKS));
System.out.println("一年前的日期:"+today.plus(-1, ChronoUnit.YEARS));
System.out.println("一天前的日期:"+today.plus(-1, ChronoUnit.DAYS));
System.out.println("一个月前的日期:"+today.plus(-1, ChronoUnit.MONTHS));
System.out.println("一年后的日期:"+today.plus(1, ChronoUnit.YEARS));
//使用minus方法计算以前的日期
System.out.println("一年前的日期:"+today.minus(1,ChronoUnit.YEARS));
System.out.println("一周前的日期:"+today.minus(1,ChronoUnit.WEEKS));
}
/**
* 日期判断是否晚于/早于某个日期
*/
@Test
public void compareDay(){
LocalDate day1 = LocalDate.now(); //当前的日期
LocalDate day2 = LocalDate.of(2018,3,3); //2018年3月3日
System.out.println(day1.isAfter(day2)); //给定的日期大于传入的日期,则返回true
System.out.println(day2.isBefore(day1)); //给定日期小于传入的日期,则返回true
}
/**
* 2月份特殊处理
*/
@Test
public void specialDay(){
YearMonth thisYearMonth = YearMonth.now(); //当前年份
System.out.println("当前年份的2月份有多少天:"+thisYearMonth.lengthOfMonth());
YearMonth lastYearMonth = YearMonth.of(2020, Month.FEBRUARY);
System.out.println("获取到2020年的2月份"+lastYearMonth);
}
/**
* 检查闰年
*/
@Test
public void checkLeapYear(){
LocalDate day1 = LocalDate.now();
System.out.println("当前年份是否是闰年:"+day1.isLeapYear());
LocalDate day2 = LocalDate.of(2020,3,3);
System.out.println("2020年是否是闰年:"+day2.isLeapYear());
}
/**
* 计算两个日期之间的天数、月数、年
*/
@Test
public void calculateDayOrMonthCount(){
LocalDate day1 = LocalDate.now();
LocalDate day2 = LocalDate.of(2018,3,3);
System.out.println("当前日期和2018年3月3日相差天数:"+day2.until(day1,ChronoUnit.DAYS));
//向下取整
System.out.println("当前日期和2018年3月3日相差月数:"+day2.until(day1,ChronoUnit.MONTHS));
//向下取整
System.out.println("当前日期和2018年3月3日相差年数:"+day2.until(day1,ChronoUnit.YEARS));
}
/**
* 获取当前时间戳
*/
@Test
public void getTimesStamp(){
Instant instant = Instant.now();
System.out.println("当前时间戳为:"+instant);
//Date和Instant对象相互转化
Date d = Date.from(instant);
Date date =new Date();
date.toInstant();
}
/**
* 日期格式化
*/
@Test
public void formatting(){
String s = "20180303";
LocalDate day = LocalDate.parse(s, DateTimeFormatter.BASIC_ISO_DATE);
System.out.println("格式化后的日期为:"+day);
}
/**
* 字符串与LocalDate的相互转化
*
* 此处,不能使用LocalDate(如果转化的只是日期,不包含时间),因为LocalDate是不包含时间的
* 也不能使用LocalTime(如果转化的只是时间),因为LocalTime是不包含日期的
* LocalDateTime的格式形如:2018-03-03T00:00
*/
@Test
public void stringAndLocalDate(){
//LocalDateTime转字符串
LocalDateTime now = LocalDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss"); //自定义日期格式
String str = now.format(formatter);
System.out.println("LocalDate转字符串:"+str);
//字符串转LocalDateTime
String dateStr = "2018年03月03日 00:00:00"; //这里的字符串日期格式,必须跟格式化的格式一致,否则会报错
LocalDateTime day = LocalDateTime.parse(dateStr,formatter);
System.out.println("字符串转LocalDateTime"+day);
}
/**
* Date与LocalDate的相互转化
*
* 通过时间戳进行相互转化
*/
@Test
public void DateAndLocalDate(){
//Date转LocalDate
Date date = new Date();
Instant instant = date.toInstant(); //Date转时间戳
ZoneId zoneId = ZoneId.systemDefault(); //获取当前系统时区
LocalDateTime localDateTime = LocalDateTime.ofInstant(instant,zoneId); //转成LocalDateTime
LocalDate localDate = localDateTime.toLocalDate();
System.out.println("Date转LocalDate: "+localDate);
//LocalDate转Date
LocalDate now = LocalDate.now();
ZoneId zoneId1 = ZoneId.systemDefault(); //获取当前系统时区
Instant instant1 = localDate.atStartOfDay(zoneId1).toInstant(); //转成时间戳
Date date1 = Date.from(instant1);
System.out.println("LocalDate转Date: "+date1);
}
/**
* Date与LocalTime相互转化
*/
@Test
public void DateAndLocalTime(){
//Date转LocalTime
Date date = new Date();
Instant instant = date.toInstant(); //Date转时间戳
ZoneId zoneId = ZoneId.systemDefault(); //获取系统时区
LocalDateTime localDateTime = LocalDateTime.ofInstant(instant,zoneId); //先转成LocalDateTime
LocalTime localTime = localDateTime.toLocalTime(); //LocalDateTime转成LocalTime
System.out.println("Date转LocalTime: "+localTime);
//LocalTime转Date
LocalTime localTime1 = LocalTime.now();
LocalDate localDate = LocalDate.now();
LocalDateTime localDateTime1 = LocalDateTime.of(localDate,localTime1); //根据LocalDate和LocalTime转成LocalDateTime
ZoneId zoneId1 = ZoneId.systemDefault(); //获取系统时区
Instant instant1 = localDateTime1.atZone(zoneId1).toInstant(); //根据时区转成时间戳
Date date1 = Date.from(instant1); //时间戳转Date
System.out.println("LocalTime转Date: "+date1);
}
/**
* Date与LocalDateTime相互转化
*/
@Test
public void DateAndLocalDateTime(){
//Date转LocalTime
Date date = new Date();
Instant instant = date.toInstant(); //Date转时间戳
ZoneId zoneId = ZoneId.systemDefault(); //获取系统时区
LocalDateTime localDateTime = LocalDateTime.ofInstant(instant,zoneId);
System.out.println("Date转LocalTime: "+localDateTime);
//LocalTime转Date
LocalDateTime localDateTime1 = LocalDateTime.now();
Instant instant1 = localDateTime1.atZone(zoneId).toInstant();
Date date1 = Date.from(instant1);
System.out.println("LocalTime转Date: "+date1);
}
}
日积月累,终有收获。