一、JDK1.8新增的时间日期API
* LocalDate表示年月日
* LocalTime表示时分秒
* LocalDateTime表示年月日时分秒
1、获取对象的方法
- 通过静态方法now()获取当前时间
LocalDate now1 = LocalDate.now();
LocalTime now2 = LocalTime.now();
LocalDateTime now3 = LocalDateTime.now();
- 通过静态方法of可以设置时间
LocalDate of1 = LocalDate.of(2008, 10, 10);
LocalTime of2 = LocalTime.of(12, 12, 12);
LocalDateTime of3 = LocalDateTime.of(1994, 10, 10, 1, 2, 3);
2.常用方法
- 有关获取的方法
LocalDateTime now = LocalDateTime.now();
int year = now.getYear();
Month month = now.getMonth();//获取的是哪一月,返回的是一个枚举类型
int monthValue = now.getMonthValue();
int dayOfMonth = now.getDayOfMonth();
int dayOfYear = now.getDayOfYear();
- 格式化日期的方法
LocalDateTime now = LocalDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日");
String format = now.format(formatter);
System.out.println(format);
- 转换的方法
LocalDateTime now = LocalDateTime.now();
LocalDate localDate = now.toLocalDate();
LocalTime localTime = now.toLocalTime();
- 判断日期的方法
LocalDate now = LocalDate.now();
LocalDate date = LocalDate.of(2015, 9, 6);
//判断一个日期是在另一个日期之前还是之后
boolean b1 = now.isBefore(date);//false
boolean b2 = now.isAfter(date);//true
//判断两个日期是否相等
boolean b3 = now.isEqual(now);//true
//判断是不是闰年
boolean b4 = now.isLeapYear();//false
- 解析日期字符串
//按照默认格式解析日期字符串
String str1="2015-06-06";
LocalDate parse1 = LocalDate.parse(str1);
String str2="13:04:35";
LocalTime parse2 = LocalTime.parse(str2);
String str3="2017-08-29T12:12:12";
LocalDateTime parse3 = LocalDateTime.parse(str3);
//按照我们自己指定的格式解析字符串
String str4="2015年06月06号";
DateTimeFormatter pattern = DateTimeFormatter.ofPattern("yyyy年MM月dd号");
LocalDate parse = LocalDate.parse(str4, pattern);
String str5="06点06分06秒";
DateTimeFormatter pattern1 = DateTimeFormatter.ofPattern("HH点mm分ss秒");
LocalTime parse4 = LocalTime.parse(str5, pattern1);
String str6="2015年06月06号 06点06分06秒";
DateTimeFormatter pattern2 = DateTimeFormatter.ofPattern("yyyy年MM月dd号 HH点mm分ss秒");
LocalDateTime parse5 = LocalDateTime.parse(str6, pattern2);
- 添加、减去时间量的方法
//添加年月日时分秒的方法,plus系列的方法
//每次添加完时间量,都会返回一个新的LocalDateTime日期对象
LocalDateTime now = LocalDateTime.now();
LocalDateTime localDateTime = now.plusYears(1);
LocalDateTime localDateTime1 = now.plusMonths(2);
LocalDateTime localDateTime2 = now.plusDays(10);
//减去年月日时分秒的方法,minus系列的方法
//每次减完时间量,也都会返回一个新的LocalDateTime日期对象
LocalDateTime localDateTime3 = now.minusYears(1);
LocalDateTime localDateTime4 = now.minusMonths(0);
LocalDateTime localDateTime5 = now.minusDays(1);
- 设置年月日时分秒的方法,with系列
//LocalDateTime.of()
LocalDateTime now = LocalDateTime.now();
//with系列
LocalDateTime localDateTime = now.withDayOfMonth(10);
LocalDateTime with = now.with(TemporalAdjusters.firstDayOfMonth());
LocalDateTime with1 = now.with(TemporalAdjusters.firstDayOfNextMonth());
LocalDateTime with2 = now.with(TemporalAdjusters.next(DayOfWeek.FRIDAY));
二、Instant时间戳类
Instant时间戳类从1970-01-01 00:00:00截止到当前时间的毫秒值
- 获取对象的方法:now()
Instant now = Instant.now();
System.out.println(now);
//默认取出来的是当前的美国时间,和我们相差8小时
- 设置偏移量的方法:atOffset()
Instant now = Instant.now();
OffsetDateTime offsetDateTime = now.atOffset(ZoneOffset.ofHours(8));
//ZoneOffset设置偏移时间
- 获取系统默认时区时间的方法:atZone()
//ZoneId世界时区编号的一个类
Instant now = Instant.now();
//atzone()方法的参数是要一个时区的编号可以通过时区编号类ZoneId获取出来
ZonedDateTime zonedDateTime = now.atZone(ZoneId.systemDefault());
//ZoneId.systemDefault()获取本地的默认时区ID
获取任意时区时间的方法
Instant now = Instant.now();
ZoneId of = ZoneId.of("Asia/Shanghai");
ZonedDateTime zonedDateTime = now.atZone(of);
System.out.println(zonedDateTime);
- get系列的方法
Instant now = Instant.now();
long epochSecond = now.getEpochSecond();//获取从1970-01-01 00:00:00到当前时间的秒值
long l = now.toEpochMilli();//获取从1970-01-01 00:00:00到当前时间的毫秒值
- ofEpochSecond()方法、ofEpochMilli()
//ofEpochSecond()方法 给计算机元年增加秒数
//ofEpochMilli() 给计算机元年增加毫秒数
Instant instant = Instant.ofEpochMilli(1000 * 60 * 60);
Instant instant1 = Instant.ofEpochSecond(5);
三、Duration、Period
Duration : 用于计算两个“时间”间隔的类
//Duration可以计算两个时间的间隔
Instant start = Instant.now();
for (int i = 0; i < 100000; i++) {
System.out.println(" ");
}
Instant end = Instant.now();
//静态方法between()计算两个时间的间隔,默认是秒
Duration between = Duration.between(start, end);
//Duration中的toMillis()方法:将秒转为毫秒
long l = between.toMillis();
System.out.println(l);
Period : 用于计算两个“日期”间隔的类
//Period用于计算两个日期的间隔
LocalDate start = LocalDate.of(2015, 9, 1);
LocalDate end = LocalDate.of(2019, 9, 1);
//Period中的静态方法between()
Period between = Period.between(start, end);
int years = between.getYears();//间隔了多少年
int months = between.getMonths();//间隔了几个月
int days = between.getDays();//间隔类多少天
四、TemporalAdjuster 时间校正器:设置日期
1.按照系统系统的方式设置日期
LocalDate now = LocalDate.now();
//TemporalAdjuster时间校正器,是个接口
LocalDate with = now.with(TemporalAdjusters.next(DayOfWeek.FRIDAY));
System.out.println(with);
TemporalAdjuster temporalAdjuster = TemporalAdjusters.nextOrSame(DayOfWeek.FRIDAY);
LocalDate with1 = now.with(temporalAdjuster);
System.out.println(with1);
2.按照自定义方式设置日期
public static void main(String[] args) {
//采用自定义方式来指定日期。比如下个工作日
//今天如果时星期五 下个工作日 +3
//今天如果时星期六 下个工作日 +2
//其他 +1
LocalDate now = LocalDate.now();
LocalDate newDate = now.with(new TemporalAdjuster() {
@Override
public Temporal adjustInto(Temporal temporal) {
//temporal当前日期
//向下转型
LocalDate localDate= (LocalDate) temporal;
//获取当前日期是星期几
DayOfWeek dayOfWeek = localDate.getDayOfWeek();
if(dayOfWeek.equals(DayOfWeek.FRIDAY)){
LocalDate localDate1 = localDate.plusDays(3);
return localDate1;
}else if(dayOfWeek.equals(DayOfWeek.SATURDAY)){
LocalDate localDate1 = localDate.plusDays(2);
return localDate1;
}else{
LocalDate localDate1 = localDate.plusDays(1);
return localDate1;
}
}
});
System.out.println(newDate);
}
五、DateTimeFormatter :解析和格式化日期或时间的类
1.把日期对象转化为字符串
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日");
LocalDate now = LocalDate.now();
//方式1 可以使用DateTimeFormatter 他的format()
String format = formatter.format(now);
System.out.println(format);
//方式2 使用 LocalDate 的format方法
String format1 = now.format(formatter);
System.out.println(format1);
//使用自带的格式
String format2 = now.format(DateTimeFormatter.ISO_DATE);
System.out.println(format2);
2.把字符串解析成日期对象
//按照系统自定义的转换规格
String str="2018-10-10";
LocalDate parse = LocalDate.parse(str);
System.out.println(parse);
//自定义转换规格
String str1="2015年05月12日";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日");
LocalDate parse1 = LocalDate.parse(str1, formatter);
System.out.println(parse1);
六、带时区的时间或日期ZonedDate、ZonedTime、ZonedDateTime
用法和 LocalDate、 LocalTime、 LocalDateTime 一样 只不过ZonedDate,ZonedTime、ZonedDateTime 这三个带有当前系统的默认时区
1、ZoneID 世界时区类
ZoneId.getAvailableZoneIds();//获取世界各个地方的时区的集合
ZoneId.systemDefault();//获取系统默认时区的ID
- 获取带有时区的日期对象
//方式1
LocalDateTime now = LocalDateTime.now();//创建日期对象
ZoneId zoneId = ZoneId.of("Asia/Shanghai");//根据各个地区的时区ID创建对象
ZonedDateTime dateTime = now.atZone(zoneId);//通过时区ID获取带有时区的日期对象
System.out.println(dateTime);
//方式2:通过时区ID获取日期对象
LocalDateTime now1 = LocalDateTime.now(ZoneId.of("Asia/Shanghai"));
System.out.println(now1);