在Java8之前对时间支持的库只有Date和Calender库。其中Date类中的很多方法都已经被废弃了,取而代之的是java.util.Calender类。然后Calender类仍然拥有Date类中的一些问题和设计缺陷。如,月份仍然是从0开始计算。为解决这些缺陷,Java8中提供了新的日期和时间API,如操纵、解析、打印输出日期-时间对象,使用不同的时区和年历。
LocalDate是个不可变对象 ,只提供简单的日期(年-月-日),不附带任何与时区相关的信息
public final class LocalDate implements Temporal, TemporalAdjuster, ChronoLocalDate, Serializable
可以通过静态工厂方法of()创建一个LocalDate实例。
LocalDate date = LocalDate.of(2016, 3, 28);
//2016
int year = date.getYear();
//MARCH
Month month = date.getMonth();
//3
int monthValue = date.getMonthValue();
//28
int day = date.getDayOfMonth();
//该日是该年的多少天
int count = date.getDayOfYear();
//该日是该星期的多少天
int dayOfWeek = date.getDayOfWeek().getValue();
//是否闰年
boolean leap = date.isLeapYear();
//获取当前时间, (年月日)
LocalDate localDate = LocalDate.now();
//当前时间, 格式:yyyy-mm-dd
String dateStr = localDate.toString();
//格式化时间
LocalDate date = LocalDate.parse("2018-05-17");
使用TemporalField读取LocalDate的值
LocalDate localDate = LocalDate.of(2016, 3, 28);
int year = localDate.get(ChronoField.YEAR);
int month = localDate.get(ChronoField.MONTH_OF_YEAR);
int day = localDate.get(ChronoField.DAY_OF_MONTH);
LocalTime是一个不可变的日期时间对象, 用来表示时-分-秒-毫秒。
public final class LocalTime implements Temporal, TemporalAdjuster, Comparable, Serializable
与LocalDate相同LocalTime也可以通过now()方法获取当前时间,通过of()创建一个不可变的时间
LocalTime localTime = LocalTime.now();
LocalTime time = LocalTime.of(17, 30, 25, 100);
//小时
int hour = time.getHour();
//分钟
int minute = time.getMinute();
//秒
int second = time.getSecond();
//毫秒
int nano = time.getNano();
//时间格式化
LocalTime time2 = LocalTime.parse("15:35:32.111");
LocalDateTime是LocalDate和LocalTime的合体,同时表示了日期 和时间,但不带有时区信息,可以直接创建,也可以通过合并日期和时间对象构造。
LocalDateTime localDateTime1 = LocalDateTime.now();
LocalDateTime localDateTime2 = LocalDateTime.of(localDate, time);
LocalDateTime localDateTime3 = LocalDateTime.of(2017,5 , 25, 14, 15, 52);
可通过如下方式获取LocalDate和LocalTime
LocalDate date1 = localDateTime1.toLocalDate();
LocalTime time1 = localDateTime1.toLocalTime();
对时间进行更改
System.out.println("当前时间:" + localDateTime1);
System.out.println("7天后:" + localDateTime1.plusDays(7));
System.out.println("1小时后:" + localDateTime1.plusHours(1));
System.out.println("7天前:" + localDateTime1.minusDays(7));
System.out.println("1小时前:" + localDateTime1.minusHours(1));
System.out.println("固定时间 18点:" + localDateTime1.withHour(18));
System.out.println("固定时间 10分:" + localDateTime1.withMinute(10));
//转换为String
localDateTime1.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
//转换为Date
Date.from(localDateTime1.atZone(ZoneId.systemDefault()).toInstant());
//Date转换LocalDateTime
LocalDateTime.ofInstant(new Date().toInstant(), ZoneId.systemDefault());
//设置时区为东一区
localDateTime1.atZone(ZoneId.of("UTC-1"));
相比于Calender和Date,LocalDateTime比较时间更加容易
boolean isEquals = localDateTime1.equals(localDateTime1);
boolean isAfter = localDateTime1.isAfter(localDateTime2);
boolean isBefore = localDateTime1.isBefore(localDateTime2);
Period.between()方法只能日期之间
package time;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.Date;
/**
* @ClassName : LocalDateTimeUtils
* @Author : bianwc
* @Date : 2019/8/15 15:37
* @Description : TODO
*/
public class LocalDateTimeUtils {
/**
* date格式化为LoclDateTime
* @param date
* @return
*/
public static LocalDateTime formateLocalDateTime(Date date) {
return LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());
}
/**
* LocalDateTime格式化为Date
* @param localDateTime
* @return
*/
public static Date formateDate(LocalDateTime localDateTime) {
return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
}
/**
* 获取当前时间
* @return
*/
public static LocalDateTime getNow() {
return LocalDateTime.now();
}
/**
* 获取指定时间的指定格式
* @param time
* @param pattern
* @return
*/
public static String formatTime(LocalDateTime time, String pattern) {
return time.format(DateTimeFormatter.ofPattern(pattern));
}
/**
* 获取当前时间的指定格式
* @param pattern
* @return
*/
public static String formatNow(String pattern) {
return formatTime(LocalDateTime.now(), pattern);
}
/**
* 日期增加一个数 nuit决定增加的格式
* @param time
* @param number
* @param unit
* @return
*/
public static LocalDateTime plus(LocalDateTime time, long number, ChronoUnit unit) {
return time.plus(number, unit);
}
/**
* 日期减少一个数
* @param time
* @param number
* @param unit
* @return
*/
public static LocalDateTime minus(LocalDateTime time, long number, ChronoUnit unit) {
return time.minus(number, unit);
}
/**
* 两个日期的差值
* @param startTime
* @param endTime
* @return
*/
public static long between(LocalDateTime startTime, LocalDateTime endTime, ChronoUnit unit) {
return unit.between(startTime, endTime);
}
/**
* 检查两个日期是否相同
* @param localDateTime1
* @param localDateTime2
* @return
*/
public static boolean isEquals(LocalDateTime localDateTime1, LocalDateTime localDateTime2) {
return localDateTime1.equals(localDateTime2);
}
/**
* 日期1是否大于日期2
* @param localDateTime1
* @param localDateTime2
* @return
*/
public static boolean isAfter(LocalDateTime localDateTime1, LocalDateTime localDateTime2) {
return localDateTime1.isAfter(localDateTime2);
}
/**
* 日期1是否小于日期2
* @param localDateTime1
* @param localDateTime2
* @return
*/
public static boolean isBefore(LocalDateTime localDateTime1, LocalDateTime localDateTime2) {
return localDateTime1.isBefore(localDateTime2);
}
/**
* 获取日期的开始时间
* @param localDateTime
* @return
*/
public static LocalDateTime getDayStart(LocalDateTime localDateTime) {
return localDateTime.withHour(0)
.withMinute(0)
.withSecond(0)
.withNano(0);
}
/**
* 获取日期的结束时间
* @param localDateTime
* @return
*/
public static LocalDateTime getDayEnd(LocalDateTime localDateTime) {
return localDateTime.withHour(23)
.withMinute(59)
.withSecond(59)
.withNano(999999999);
}
}