JDK1.8新增
1.时间日期API java.time
LocalDate(年月日)、
LocalTime 表 时分秒
LocalDateTime 年月日时分秒
使用 ISO-8601日历系统(国际标准化组织制定的现代公民的日期和时间的表示法)的日期、时间、日期和时间
A获取日期对象方法
1.静态方法获取对象now()
LocalDate ld = LocalDate.now();
LocalTime lt = LocalTime .now();
LocalDateTime ldt = LocalDateTime .now();//2018-11-23T10:15:30中间要有T
2.静态方法of()获取指定日期对象
LocalDate ld = LocalDate.of(2018,12,15);
LocalDateTime ldt = LocalDateTime.of(2018,10,25,12,20,30);
B.获取方法
LocalDateTime ldt = LocalDateTime .now();
int year = ldt.getYear();获取年
int minute = ldt.getMinute();获取分钟
ldt.getHour();获取小时
getDayOfMonth 获得月份天数(1-31)
getDayOfYear 获得年份天数(1-366)
getDayOfWeek 获得星期几(返回一个 DayOfWeek枚举值)
getMonth 获得月份, 返回一个 Month 枚举值
getMonthValue 获得月份(1-12)
getYear 获得年份
C.格式化日期
format()、DateTimeFormatter.ofPattern(日期格式字符串)
LocalDateTime ldt = LocalDateTime .now();
DateTimeFormatter df = DateTimeFormatter.ofPattern(日期格式字符串);
ldt.format(df);
D.转换的方法
LocalDateTime ldt = LocalDateTime .now();
ldt.toLocalTime();
ldt.toLocalDate();
E.判断的方法
LocalDate ld = LocalDate.now();
LocalDate do = LocalDate.of(2010,10,25);
ld.isAfter(do);//判断一个日期是在另一个日期之后
ld.isBefore(do);
ld.isEqual(do);
ld.idLeapYear();//判断是否为闰年
F.解析的方法parse()
将一个日期字符串解析为日期对象,字符串日期的写法格式要正确(默认是ISO-8601日历系统)
String str = "2018-12-16T14:23:56";
LocalDateTime ldt = LocalDateTime.parse(str);
按照我们指定的格式去解析:
LocalDateTime ldt4 = LocalDateTime.now();
DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime.parse("2018-01-21 20:30:36", formatter2);
G.日期加plus系列–减minus系列方法
返回新的LocalDateTime的对象
LocalDateTime ldt = LocalDateTime.now();
LocalDateTime ldtp = ldt.plus年/月/周/日/时/分/秒/纳秒(10);
LocalDateTime ldtm = ldt.minus年/月/周/日/时/分/秒/纳秒(10);
H.指定日期with()系列方法
LocalDateTime ldt = LocalDateTime.now();
ldt.withDayOfMonth(10);//指定日期当月10号
ldt.with(TemporalAdjuster adjuster);
ldt.with(TemporalAdjusters.firstDayOfMonth());//本月第一天的日期对象
ldt.with(TemporalAdjusters.firstDayOfNextMonth());//下个月第一天的日期对象
ldt.with(TemporalAdjusters.next(DayOfWeek.FRIDAY));//下个星期五的日期对象
//获取这个月的第几个星期几是几号,比如 TemporalAdjusters.dayOfWeekInMonth(2, DayOfWeek.FRIDAY) 代表的意思是这个月的第二个星期五是几号
// TemporalAdjusters.dayOfWeekInMonth(2, DayOfWeek.FRIDAY)
LocalDateTime with1 = now.with(TemporalAdjusters.dayOfWeekInMonth(2,DayOfWeek.FRIDAY));
2.时间戳类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
Set<String> avalableXZoneIDs = zoneID.getAvailableZoneIDs();获取世界各个时区的ZoneID
ZonedDateTime zonedDateTime = ins.atZone(ZoneId.systemDefault());
System.out.println(zonedDateTime);
4.get系列的方法
getEpochSecond() 获取从1970-01-01 00:00:00到当前时间的秒值 Epoch纪元
getNano()方法是把获取到的当前时间的秒数 换算成纳秒
long epochSecond = ins.getEpochSecond();//获取从1970-01-01 00:00:00到当前时间的秒值
long l = now.toEpochMilli();//获取纪元毫秒值
getNano()方法是把获取到的当前时间的豪秒数 换算成纳秒 比如当前时间是2018-01-01 14:00:20:30
那就把30豪秒换算成纳秒 int nano = ins.getNano();
5. ofEpochSecond()方法 给计算机元年增加秒数
例如 Instant instant = Instant.ofEpochSecond(5);
System.out.println(instant);
单位换算
0.1 毫秒 = 10 的5次方纳秒 = 100000 纳秒
1 毫秒 = 1000 微妙 = 1000000 纳秒
3.Duration Period
计算两个“时间”间隔的类between() 计算两个“日期”间隔的类
Instant start = Instant.now();
for (int i = 0; i < 100000; i++) {
System.out.println(' ');
}
Instant end = Instant.now();
//Duration 可以计算两个时间的间隔
Duration between = Duration.between(start, end);
between.to天/时/分/秒/纳秒();
long l = between.toMillis();
LocalDate birthday = LocalDate.of(1995,10,26);
LocalDate now = LocalDate.now();
Period bt = Period.between(birthday,now);//只能算年月日不能具体到时分秒
int years = bt.getYears();
int months = bt.getMonths();
int days = bt.getDays();
4.TemporalAdjuster:时间校正器 接口
一般我们用该接口的一个对应工具类TemporalAdjusters中的一些常量来指定日期
LocalDate ld = LocalDate.now();
ld.with();//其中一个方法需要TemporalAdjuster类型,此类是接口,我们可以通过其对应工具类TemporalAdjusters中的一些方法 获取TemporalAdjuster子类对象
1 使用TemporalAdjusters自带的常量来设置日期
LocalDate with = ld.with(TemporalAdjusters.lastDayOfYear());
System.out.println(with);
2 采用TemporalAdjusters中的next方法来指定日期
TemporalAdjuster ta = TemporalAdjusters.nextOrSame(DayOfWeek.SATURDAY);//需要枚举类DayOfWeek类型作为参数
LocalDate ldw = ld.with(ta);
3 采用自定义的方式来指定日期 比如指定下个工作日
LocalDateTime ldt = LocalDateTime.now();
LocalDateTime workDay = ldt.with(new TemporalAdjuster() {
@Override
public Temporal adjustInto(Temporal temporal) {
//向下转型
LocalDateTime ld = (LocalDateTime) temporal;
//获取这周的星期几
DayOfWeek dayOfWeek = ld.getDayOfWeek();
if (dayOfWeek.equals(DayOfWeek.FRIDAY)) {
return ld.plusDays(3);//如果这天是星期五,那下个工做日就加3天
} else if (dayOfWeek.equals(DayOfWeek.SATURDAY)) {
return ld.plusDays(2);//如果这天是星期六,那下个工做日就加2天
} else {
//其他就加一天
return ld.plusDays(1);
}
}
});
System.out.println(workDay);
5.DateTimeFormatter :
解析和格式化日期或时间的类 由日期时间的格式组成的 类
格式化日期的步骤
1.获取日期格式对象的方式,通过静态方法ofPattern("yyyy-MM-dd");
DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd");
2.1日期格式类中或日期类中的format()方法 把一个日期对象的默认格式 格式化成上面指定的日期格式 的日期字符串
LocalDateTime now = LocalDateTime.now();
String format1 = dateFormat.format(now);//日期格式类中的format方法需要日期为参数
String date = now.format(dateFormat);//日期类中的format方法需要一个日期格式为参数
2.2.格式化日期 使用日期类中的format方法 传入一个日期格式类中提供好的日期格式常量把一个日期对象格式化成指定的日期格式 的日期字符串
LocalDateTime now1 = LocalDateTime.now();
//使用DateTimeFormatter中提供好的日期格式常量
//时间类对象提供的信息必须多余或等于时间格式类对象需要的时间信息,否则会运行报错
//下面是转为默认格式
String d = now1.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME);
3.使用 自定义的日期格式 格式化 日期对象 为 指定格式 日期字符串
DateTimeFormatter timeFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");//自定义一个日期格式
String time = now1.format(timeFormat);
System.out.println(time);
4. 把一个 日期字符串 转成 日期对象 parse
//4.1把 一个日期字符串 转成 默认格式的 日期对象
String str = "2018-10-25";
LocalDate ld = LocalDate.parse(str);
//4.2使用日期类中的parse方法传入一个日期字符串,传入对应的日期格式化类
DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDateTime parse = LocalDateTime.parse(time, timeFormat);//除了日期字符串还要加上日期格式
System.out.println(parse);
6.ZonedDate ZonedTime ZonedDateTime
带时区的时间或日期 用法和 LocalDate、 LocalTime、 LocalDateTime 一样 只不过ZonedDate,ZonedTime、ZonedDateTime 这三个带有当前系统的默认时区
1.获取世界各个地方的时区的集合 的方法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"));
System.out.println(now2);