JAVASE基础模块四十八(JDK1.8 新增的日期时间API)
概念及相关
LocalDate、 LocalTime、 LocalDateTime类的实例是不可变的对象,
分别表示使用 ISO-8601日历系统的日期、时间、日期和时间。
它们提供了简单的日期或时间,并不包含当前的时间信息。也不包含与时区相关的信息。
注: ISO-8601日历系统是国际标准化组织制定的现代公民的日期和时间的表示法
这些新增的日期时间API都在 java.time包下
方法
#获取对象的方法
方式1通过静态方法 now();
例如:LocalDateTime ldt = LocalDateTime.now();
方式2通过静态方法of()方法参数可以指定年月日时分秒
例如:LocalDateTime of = LocalDateTime.of(2018, 12, 30, 20, 20, 20);
#常用方法
1.与获取相关的方法:get系类的方法
ldt.getYear();获取年
ldt.getMinute();获取分钟
ldt.getHour();获取小时
getDayOfMonth 获得月份天数(1-31)
getDayOfYear 获得年份天数(1-366)
getDayOfWeek 获得星期几(返回一个 DayOfWeek枚举值)
getMonth 获得月份, 返回一个 Month 枚举值
getMonthValue 获得月份(1-12)
getYear 获得年份
2.格式化日期日期字符串的方法 format()
例如:String yyyy = ldt.format(DateTimeFormatter.ofPattern("yyyy"));
3.转换的方法 toLocalDate();toLocalTime();
例如:LocalDate localDate = ldt.toLocalDate();
例如:LocalTime localTime = ldt.toLocalTime();
4.判断的方法
isAfter()判断一个日期是否在指定日期之后
isBefore()判断一个日期是否在指定日期之前
isEqual(); 判断两个日期是否相同
isLeapYear()判断是否是闰年注意是LocalDate类中的方法
例如: boolean after = ldt.isAfter(LocalDateTime.of(2024, 1, 1, 2, 3));
例如 boolean b= LocalDate.now().isLeapYear();
5.解析的静态方法parse("2007-12-03T10:15:30");
paser() 将一个日期字符串解析成日期对象,注意字符串日期的写法的格式要正确,否则解析失败
例如:LocalDateTime parse = LocalDateTime.parse("2007-12-03T10:15:30");
按照我们指定的格式去解析:
注意细节:如果用LocalDateTime 想按照我们的自定义的格式去解析,注意
日期字符串的 年月日时分秒要写全,不然就报错
LocalDateTime ldt4 = LocalDateTime.now();
DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime.parse("2018-01-21 20:30:36", formatter2);
6.添加年月日时分秒的方法 plus系列的方法 都会返回一个新的LocalDateTime的对象
LocalDateTime localDateTime = ldt.plusYears(1);
LocalDateTime localDateTime1 = ldt.plusMonths(3);
LocalDateTime localDateTime2=ldt.plusHours(10);
7.减去年月日时分秒的方法 minus 系列的方法 注意都会返回一个新的LocalDateTime的对象
例如:LocalDateTime localDateTime2 = ldt.minusYears(8);
8.指定年月日时分秒的方法 with系列的方法 注意都会返回一个新的LocalDateTime的对象
获取时间
package New.X1;
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
public class DateAPI {
public static void main(String[] args) {
LocalDate now = LocalDate.now();
System.out.println(now);
LocalTime now1 = LocalTime.now();
System.out.println(now1);
LocalDateTime now2 = LocalDateTime.now();
System.out.println(now2);
int y = now2.getDayOfYear();
int m = now2.getDayOfMonth();
int m1 = now2.getMonthValue();
DayOfWeek w = now2.getDayOfWeek();
int h = now2.getHour();
System.out.println(y);
System.out.println(m);
System.out.println(m1);
System.out.println(w);
System.out.println(h);
LocalDateTime of = LocalDateTime.of(2018, 6, 25, 15, 54);
System.out.println(of);
}
}
运行结果:
2020-09-08
10:35:35.874994900
2020-09-08T10:35:35.874994900
252
8
9
TUESDAY
10
2018-06-25T15:54
格式化时间
DateTimeFormatter g = DateTimeFormatter.ofPattern(“yyyy年MM月dd日 HH时mm分ss秒”) 格式化日期的类 now.format(g) 格式化日期 解析日期 LocalDateTime.parse(s, DateTimeFormatter.ofPattern(“yyyy年MM月dd日 HH时mm分ss秒”))
package New.X1;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class GeShiHua {
public static void main(String[] args) {
LocalDateTime now = LocalDateTime.now();
System.out.println(now);
DateTimeFormatter g = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH时mm分ss秒");
String s = now.format(g);
System.out.println(s);
System.out.println("==================");
String se="2020年12月31日 23时59分59秒";
LocalDateTime mo = LocalDateTime.parse(s, DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH时mm分ss秒"));
System.out.println(mo);
}
}
运行结果:
2020-09-08T10:38:23.746882300
2020年09月08日 10时38分23秒
==================
2020-09-08T10:38:23
时间减少
package New.X1;
import java.time.LocalDateTime;
public class Jian {
public static void main(String[] args) {
//minxxx 减去时间
LocalDateTime now = LocalDateTime.now();
LocalDateTime y = now.minusYears(5);
LocalDateTime m = now.minusMonths(10);
System.out.println(y);
System.out.println(m);
}
}
运行结果:
2015-09-08T10:39:08.165758400
2019-11-08T10:39:08.165758400
时间增加
package New.X1;
import java.time.LocalDateTime;
public class ZengJia {
public static void main(String[] args) {
LocalDateTime now = LocalDateTime.now();
LocalDateTime y = now.plusYears(3);
LocalDateTime m = now.plusMonths(5);
//plusxxx 的方法 返回的是新的对象
System.out.println(y);
System.out.println(m);
}
}
运行结果:
2023-09-08T10:39:42.570011700
2021-02-08T10:39:42.570011700
时间判断
package New.X1;
import java.time.LocalDate;
public class PanDuan {
public static void main(String[] args) {
LocalDate of = LocalDate.of(2022, 3, 24);
LocalDate now = LocalDate.now();
/*
判断时间前后
*/
System.out.println(of.isBefore(now));
System.out.println(of.isAfter(now));
/*
判断是不是闰年
*/
System.out.println(of.isLeapYear());
}
}
运行结果:
false
true
false
月份与时期的取值
package New.X1;
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.temporal.TemporalAdjuster;
import java.time.temporal.TemporalAdjusters;
public class ZhiD {
public static void main(String[] args) {
LocalDate now = LocalDate.now();
System.out.println(now);
LocalDate y = now.withYear(3333);
System.out.println(y);
System.out.println("==================================");
/*
月份的第一天
下周几的日期
*/
TemporalAdjuster one = TemporalAdjusters.firstDayOfMonth();
LocalDate w = now.with(one);
System.out.println(w);
TemporalAdjuster one1 = TemporalAdjusters.next(DayOfWeek.SATURDAY);
LocalDate w1 = now.with(one1);
System.out.println(w1);
TemporalAdjuster one2 = TemporalAdjusters.nextOrSame(DayOfWeek.WEDNESDAY);
LocalDate w2 = now.with(one2);
System.out.println(w2);
}
}
运行结果:
2020-09-08
3333-09-08
==================================
2020-09-01
2020-09-12
2020-09-09
Instant 时间戳类从1970-01-01 00:00:00 截止到当前时间的毫秒值
1获取对象的方法 now()
注意默认获取出来的是当前的美国时间和我们相差八个小时
Instant ins = Instant.now();
System.out.println(ins);
我们在东八区 所以可以加8个小时 就是我们的北京时间
2. Instant中设置偏移量的方法:atOffset() 设置偏移量
OffsetDateTime time = ins.atOffset(ZoneOffset.ofHours(8));
System.out.println(time);
3.获取系统默认时区时间的方法atZone()
方法的参数是要一个时区的编号可以通过时区编号类获取出来
ZoneId.systemDefault()获取本地的默认时区ID
ZonedDateTime zonedDateTime = ins.atZone(ZoneId.systemDefault());
System.out.println(zonedDateTime);
4.get系列的方法
getEpochSecond() 获取从1970-01-01 00:00:00到当前时间的秒值
toEpochMilli();获取从1970-01-01 00:00:00到当前时间的毫秒值
getNano()方法是把获取到的当前时间的秒数 换算成纳秒
long epochSecond = ins.getEpochSecond();//获取从1970-01-01 00:00:00到当前时间的秒值
getNano()方法是把获取到的当前时间的豪秒数 换算成纳秒 比如当前时间是2018-01-01 14:00:20:30
5. ofEpochSecond()方法 给计算机元年增加秒数
ofEpochMilli() 给计算机元年增加毫秒数
单位换算
0.1 毫秒 = 10 的5次方纳秒 = 100000 纳秒
1 毫秒 = 1000 微妙 = 1000000 纳秒
毫秒值
package New.X2;
import java.time.Instant;
import java.util.Date;
public class HaoMiao {
public static void main(String[] args) {
long t = new Date().getTime();
System.out.println(t);
//获取1970-到现在的秒值
Instant i = Instant.now();
long miao = i.getEpochSecond();
System.out.println(miao);
//获取1970-到现在的毫秒值
long l = i.toEpochMilli();
System.out.println(l);
//增加秒值 增加一天
Instant in = Instant.ofEpochSecond(60 * 60 * 24);
System.out.println(in);
}
}
运行结果:
1599532925360
1599532925
1599532925361
1970-01-02T00:00:00Z
时间间隔
package New.X2;
import java.time.Duration;
import java.time.Instant;
import java.time.LocalDate;
import java.time.Period;
public class JianGe {
public static void main(String[] args) {
Instant now = Instant.now();
int n=0;
for (int i = 0; i < 500; i++) {
n++;
}
Instant end = Instant.now();
Duration b = Duration.between(now,end);
long l = b.toNanos();
System.out.println(l);
LocalDate of = LocalDate.of(1998, 11, 15);
LocalDate now1 = LocalDate.now();
Period bb = Period.between(of, now1);
int y = bb.getYears();
System.out.println(y);
int m = bb.getMonths();
System.out.println(m);
}
}
运行结果:
0
21
9
时间戳
获取世界各个地方的时区的集合 的方法getAvailableZoneIds()
使用ZoneID中的静态方法getAvailableZoneIds();来获取
例Set<String> availableZoneIds = ZoneId.getAvailableZoneIds();
2.获取系统默认时区的ID
ZoneId zoneId = ZoneId.systemDefault(); //Asia/Shanghai
3.获取带有时区的日期时间对象
//创建日期对象
LocalDateTime now = LocalDateTime.now();
//获取不同国家的日期时间根据各个地区的时区ID名创建对象
ZoneId timeID = ZoneId.of("Asia/Shanghai");
//根据时区ID获取带有时区的日期时间对象
ZonedDateTime time = now.atZone(timeID);
System.out.println(time);
//方式2 通过时区ID 获取日期对象
LocalDateTime now2 = LocalDateTime.now(ZoneId.of("Asia/Shanghai"));
package New.X2;
import java.time.*;
import java.util.Set;
public class ShiJianChuo {
public static void main(String[] args) {
Instant now = Instant.now();
System.out.println(now);
//设置偏移时间量
OffsetDateTime p = now.atOffset(ZoneOffset.ofHours(8));
System.out.println(p);
/*
ZoneID 时区类
*/
Set<String> a = ZoneId.getAvailableZoneIds();
for (String s : a) {
if (s.contains("Shanghai")) {
System.out.println(s);
}
if (s.contains("Tokyo")) {
System.out.println(s);
}
}
LocalDateTime now1 = LocalDateTime.now(ZoneId.of("Asia/Tokyo"));
System.out.println(now1);
//默认时区id
ZoneId z = ZoneId.systemDefault();
System.out.println(z);
}
}
运行结果:
2020-09-08T02:43:26.248060700Z
2020-09-08T10:43:26.248060700+08:00
Asia/Shanghai
Asia/Tokyo
2020-09-08T11:43:26.272994800
Asia/Shanghai
工作日判断
package New.X2;
import java.time.LocalDate;
import java.time.temporal.Temporal;
import java.time.temporal.TemporalAdjuster;
public class WorkDay {
public static void main(String[] args) {
LocalDate now = LocalDate.now();
System.out.println(now.getDayOfWeek());
LocalDate with = now.with(new TemporalAdjuster() {
@Override
public Temporal adjustInto(Temporal temporal) {
switch (now.getDayOfWeek()) {
case SUNDAY:
return now.plusDays(1);
case SATURDAY:
return now.plusDays(2);
case FRIDAY:
return now.plusDays(3);
case THURSDAY:
return now.plusDays(4);
case WEDNESDAY:
return now.plusDays(5);
case TUESDAY:
return now.plusDays(6);
case MONDAY:
return now.plusDays(7);
}
return null;
}
});
System.out.println(with);
}
}
运行结果:
TUESDAY
2020-09-14
@FunctionalInterface 可以检测接口是不是函数式接口
package New.X3;
@FunctionalInterface
//可以检测接口是不是函数式接口
public interface Lambda {
int show(String name,int age);
}
class Test{
public static void main(String[] args) {
a l1 = new Lambda() {
@Override
public int show(String name, int age) {
return 100;
}
};
Lambda l = (name, age) -> 100;
}
}