JAVASE基础模块四十八(JDK1.8 新增的日期时间API)

本文详细介绍了JDK1.8中新增的日期时间API,包括LocalDate、LocalTime、LocalDateTime等类的使用方法,涵盖日期时间的获取、格式化、解析、增加、减少、判断等功能。

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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值