在jdk8中的java.time包下增加了许多处理日期的类,这些类大多数是线程安全的
java.time 主要的日期处理相关类
LocalDate类,操作日期相关的数据
LocalTime类,操作时间相关的数据
LocalDateTime类,操作日期和时间
ZoneId设置时区
Duration类 求两个LocalDate持续时间,对年月日可用
Period类 求两个LocaTime持续时间,对时分秒可用
Clock时钟类
java.time.chrono包下 主要是对应不同国家的日历记录的方式
java.time.format日期格式化相关的类
DateTimeFormatter类,内置多种时间格式化对象,也可以自定义格式化对象
java.time.temporal不同国家记录时间的方式
java.time.zone设置时区相关的类
下面主要介绍几个常用的类:
LocalDate类
java.time.LocalDate,处理跟本地时间相关的日期,不处理时间
常用方法
static LocalDate now() 从系统时钟获取现在时间,以默认的时区位置,有重载的方法,可以设置时区,也可以从Clock对象获取
设置日期:
static LocalDate parse(CharSequence text) 从字符串解析日期,格式如yyyy-MM-dd
static LocalDate of(int year, int month, int dayOfMonth) 设置年月日三个参数
格式化
String format(DateTimeFormatter formatter) 将LocalDate对象按指定格式,格式化成字符串
返回日期对象中的年,月,日
int getMonthValue() 获取日期对象在一年中第几个月
int getYear() 获取日期对象是那一年
int getDayOfMonth() 获取日期对象在它的月中是第几天
int getDayOfYear() 获取日期对象在它那一年是第几天
判断方法
boolean isLeapYear() 判断日期对象所在的年是否为闰年
boolean equals(Object obj) 判断两个日期对象是否相同
设置一段时间后的日期
LocalDate plus(long amountToAdd, TemporalUnit unit) 返回当前对象加上一定日期后的新的日期对象,第一个参数是多少,第二个参数是单位
LocalDate plusDays(long daysToAdd) 返回当前对象加上一些天数后的新的日期对象
LocalDate plusMonths(long monthsToAdd) 返回当前对象加上一些月数后的新的日期对象
LocalDate plusWeeks(long weeksToAdd) 返回当前对象加上一些周数后的新的日期对象
LocalDate plusYears(long yearsToAdd) 返回当前对象加上一些年数后的新的日期对象
LocalTime类
java.time.LocalTime处理时间,不处理日期,下面介绍常用方法:
LocalDateTime atDate(LocalDate date) 结合LocalDate对象创建一个LocalDateTime对象
创建LocalTime对象
static LocalTime now() 获取现在的时间,从系统Clock中,按默认的时区
static LocalTime now(Clock clock) 从给定的Clock对象获取时间
static LocalTime now(ZoneId zone) 从系统时钟按指定时区获取时间
static LocalTime of(int hour, int minute) 根据时,分创建时间对象
static LocalTime of(int hour, int minute, int second) 根据时,分,秒创建时间对象
static LocalTime of(int hour, int minute, int second, int nanoOfSecond) 根据时,分,秒,纳秒创建时间对象
static LocalTime ofNanoOfDay(long nanoOfDay) 根据指定的纳秒值创建LocalTime对象
static LocalTime ofSecondOfDay(long secondOfDay) 根据指定的秒值创建LocalTime对象.
static LocalTime parse(CharSequence text) 根据指定的时间字符串获取LocalTime对象,格式 hh:mm:ss
static LocalTime parse(CharSequence text, DateTimeFormatter formatter) 根据给定时间字符串和格式获取LocalTime对象
格式化方法
String format(DateTimeFormatter formatter) 根据给定格式格式化时间
判断方法
boolean equals(Object obj) 检查两个时间是否相等
boolean isAfter(LocalTime other) 判断是否在给定时间对象之后
boolean isBefore(LocalTime other) 判断是否在给定时间对象之前
获取时,分,秒
int getHour() 获取时间中的小时
int getMinute() 获取时间中的分钟
int getNano() 获取时间中的毫秒
int getSecond() 获取时间中的秒数
long toNanoOfDay() 获取LocalTime在一天中的纳秒数
int toSecondOfDay() 获取LocalTime在一天中的秒数
获取加上一段时间后的LocalTime对象
LocalTime plus(long amountToAdd, TemporalUnit unit) 获取当前LocalTime对象加上一段时间后的LocalTime对象,第一个参数,数字,第二个参数 单位
LocalTime plusHours(long hoursToAdd) 获取LocalTime加上一些小时之后的LocalTime对象
LocalTime plusMinutes(long minutesToAdd) 获取LocalTime加上一些分钟之后的LocalTime对象
LocalTime plusNanos(long nanosToAdd) 获取LocalTime加上一些纳秒之后的LocalTime对象
LocalTime plusSeconds(long secondstoAdd) 获取LocalTime加上一些秒之后的LocalTime对象
按指定的时,或分,或者秒来设置LocalTime对象
LocalTime withHour(int hour) 指定LocalTime的小时字段
LocalTime withMinute(int minute) 指定LocalTime的分钟字段.
LocalTime withNano(int nanoOfSecond) 指定LocalTime的纳秒字段,如设置为0,则不显示纳秒字段
LocalTime withSecond(int second) 指定LocalTime的秒字段
下面介绍LocalDateTime类,java.time.LocalDateTime
LocalDateTime类
常用方法:
static LocalDateTime now()创建LocalDateTime对象,有重载的方法,类似于上面两个类
static LocalDateTime of(LocalDate date, LocalTime time) 根据LocalDate对象和LocalTime对象创建LocalDateTime对象
static LocalDateTime of(int year, int month, int dayOfMonth, int hour, int minute, int second) 根据给定的年月日时分秒创建对象
有重载的方法,类似于上面两个类
static LocalDateTime parse(CharSequence text) 从给定字符串创建LocalDateTime对象,格式为yyyy-MM-ddThh:mm:ss 中间的T不能省略
LocalDateTime,LocalDate,LocalTime三个类实现的接口一样,方法也相似,不一 一列举啦
下面看Duration类,处理两个LocalDate之间的差值,java.time.Duration
Duration类
用来计算两个LocalTime对象或者两个两个LocalDateTime对象之间相差的时间的
常用方法简介:
static Duration between(Temporal startInclusive, Temporal endExclusive)根据两个LocalTime或者两个LocalDateTime创建Duration对象,参数,前小后大算出来正数,否则算出来负数
long getSeconds()得到Duration对象转换成的秒数
long toDays() 将差值转换为天数返回
Period类
java.time.Period Period类用来计算两个LocalDate相差的时间
常用方法简介:
static Period between(LocalDate startDateInclusive, LocalDate endDateExclusive)根据给定的两个LocalDate对象创建Period对象,参数前小后大,算出来的为正,否则算出来负数
计算相差的年月日
int getYears() 返回两个localDate相差的年数
int getMonths(),两个LocalDate之间相差的月数
int getDays()两个LocalDate相差的天数
注意:计算年月日时,是按两个localDate对象相差的日期来计算,比如2000年1月5日到2000年1月4日,得到的年月日分别为0年11月30日
ZoneId类
java.time.ZoneId,设置时区相关,我国属于东八区,一般系统会默认设置好当地的时区
常用方法简介:
static ZoneId of(String zoneId)根据字符串设置时区,字符串格式要正确
ZonedDateTime类
java.time.ZonedDateTime,获取设置时区后的日期时间,默认为本地区的时区
now()获取本地本时区的时间
ChronoUnit枚举类
java.time.temporal.ChronoUnit,这个类中存放了一些常量,类似于Calendar类,列举几个常见的
MINUTES 分钟
HOURS 小时
DAYS 日
WEEKS 周
MONTHS 月
YEARS 年
在操作LocalTime plus(long amountToAdd, TemporalUnit unit) 等方法时,第一个参数是数值,第二个参数是单位,这个类中存放好了一些枚举值,可以直接调用作为第二个参数
代码示例
LocalDate示例:
package time;
import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
public class DateTest01 {
public static void main(String[] args) {
// 获取LocalDate对象的三种方式,1now方法,获取今天的日期
LocalDate ld1 = LocalDate.now();
System.out.println(ld1);
// 2of方法
LocalDate ld2 = LocalDate.of(2008, 6, 30);
System.out.println(ld2);
// parse方法
LocalDate ld3 = LocalDate.parse("2008-06-30");
System.out.println(ld3);
// 获取今天是这月第几天
int day = ld1.getDayOfMonth();
System.out.println(day);
// 获取今天是今天第几天
System.out.println(ld1.getDayOfYear());
// 获取今天日期是第几个月
System.out.println(ld1.getMonthValue());
// 判断今年是否闰年
System.out.println(ld1.isLeapYear());
// 获取本月有几天
System.out.println(ld1.getDayOfMonth());
// 判断ld2和ld3是否相对
System.out.println(ld2.equals(ld3));
// 设置两周后的日期
LocalDate ld4 = ld1.plus(2, ChronoUnit.WEEKS);
System.out.println(ld4);
}
}
LocalTime示例:
package time;
import java.time.LocalTime;
import java.time.temporal.ChronoUnit;
public class TimeTest02 {
public static void main(String[] args) {
LocalTime lt1 = LocalTime.now();
System.out.println(lt1);
// 不显示毫秒
LocalTime lt2 = LocalTime.now().withNano(0);
System.out.println(lt2);
// 设置时间1
LocalTime lt3 = LocalTime.parse("15:15:15");
// 设置时间2
LocalTime lt4 = LocalTime.of(15, 15, 15);
System.out.println(lt3 + ": " + lt4);
// 判断时间是否相等
System.out.println(lt3.equals(lt4));
// 设置两小时后的时间对象
LocalTime lt5 = lt1.plus(2, ChronoUnit.HOURS);
System.out.println(lt5);
// 获取当前时间的小时
System.out.println(lt1.getHour());
// 指定当前时间小时字段
System.out.println(lt1.withHour(0));
}
}
LocalDateTime示例:
package time;
import java.time.LocalDateTime;
public class LocalDateTimeTest03 {
public static void main(String[] args) {
LocalDateTime ldt1 = LocalDateTime.now();
System.out.println(ldt1);
// 将纳秒去掉
LocalDateTime ldt2 = LocalDateTime.now().withNano(0);
System.out.println(ldt2);
// 从字符串解析时间
LocalDateTime ldt3 = LocalDateTime.parse("2019-01-02T05:03:07");
System.out.println(ldt3);
LocalDateTime ldt4 = LocalDateTime.of(2015, 3, 4, 5, 6);
System.out.println(ldt4);
}
}
Duration和Period示例:
package time;
import java.time.Duration;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.Period;
public class DurationAndPeriodTest04 {
public static void main(String[] args) {
// 测试Duration
LocalDateTime ldt1 = LocalDateTime.of(2015, 3, 4, 23, 21);
LocalDateTime ldt2 = LocalDateTime.of(2016, 3, 4, 23, 26);
Duration dura1 = Duration.between(ldt1, ldt2);
System.out.println(dura1.toDays());//输出dura1表示的天数
System.out.println(dura1.getSeconds());//输出dura1表示的描述
LocalTime lt1 = LocalTime.of(15, 23, 24);
LocalTime lt2 = LocalTime.of(16, 23, 24);
Duration dura2 = Duration.between(lt1, lt2);
System.out.println(dura2.getSeconds());
System.out.println(dura2.toDays());
// 测试Period
LocalDate ld1 = LocalDate.of(2000, 1, 5);
LocalDate ld2 = LocalDate.of(2001, 1, 4);
Period per1 = Period.between(ld1, ld2);
System.out.println(per1.getDays());// 计算日期相差的值
System.out.println(per1.getMonths());// 计算12个月之内 月份相差的值
System.out.println(per1.getYears());// 计算相差几年,不超过12个月不算一年
System.out.println(
ld1 + " and " + ld2 + "相差了" + per1.getYears() + "年" + per1.getMonths() + "月" + per1.getDays() + "日");
}
}
ZoneId示例:
import java.time.Duration;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
public class ZoneIdTest05 {
public static void main(String[] args) {
// 计算从2000年1月1日到现在过了多少天,不要纳秒值了
LocalDateTime ldtNow = LocalDateTime.now().withNano(0);
LocalDateTime ldt2000 = LocalDateTime.of(2000, 1, 1, 0, 0, 0);
Duration duralife = Duration.between(ldt2000, ldtNow);
System.out.println(duralife.toDays());
// 获取本时区时间
ZonedDateTime zdt1 = ZonedDateTime.now();
System.out.println(zdt1);
// 修改时区为美国的印第安纳州
ZoneId zoneChanged = ZoneId.of("US/East-Indiana");
// 获取指定时区的时间,调用重载的now方法
ZonedDateTime zdt2 = ZonedDateTime.now(zoneChanged);
System.out.println(zdt2);
}
}