JAVA基础加强篇07——日期与时间

日期与时间

Date

Date 类概述

  • Date 类的对象在 Java 中代表是当前所在系统的此刻日期时间。

Date 的构造器

在这里插入图片描述

Date 的常用方法

在这里插入图片描述

Date 类记录时间的 2 种格式

形式1:日期对象

JAVA基础加强篇07——日期与时间_第1张图片

形式2:时间毫秒值

  • 指的是从 1970 年 1 月 1 日 00:00:00 走到此刻的总的毫秒数,应该是很大的

    JAVA基础加强篇07——日期与时间_第2张图片

/**
 * 目标:学会使用 Date 类处理时间,获取时间的信息
 */
public class DateTest {
    public static void main(String[] args) {
        // 1、创建一个 Date 类的对象:代表系统此刻日期时间对象
        Date date = new Date();
        System.out.println(date);

        // 2、获取时间毫秒值
        long time = date.getTime();
        System.out.println(time);
//        long time1 = System.currentTimeMillis();
//        System.out.println(time1);
    }
}

案例

  • 计算出当前时间往后走 1 小时 121 秒之后的时间是多少。

    /**
     * 目标:学会使用 Date 类处理时间,获取时间的信息
     */
    public class DateTest {
        public static void main(String[] args) {
            //计算出当前时间往后走 1 小时 121 秒之后的时间是多少。
            // 1、获取当前时间
            Date date1 = new Date();
            System.out.println(date1);
    
            // 2、当前时间往后走 1小时 121s
            long time2 = System.currentTimeMillis();
            time2 += (60 * 60 + 121) * 1000;
    
            // 3、把时间毫秒值转换成对应的日期对象
    //        Date date2 = new Date(time2);
    //        System.out.println(date2);
    
            Date date3 = new Date();
            date3.setTime(time2);
            System.out.println(date3);
        }
    }
    

时间毫秒值 -> 日期对象

JAVA基础加强篇07——日期与时间_第3张图片

总结

  1. 日期对象如何创建,如何获取时间毫秒值?
    • Date date = new Date();
    • Long time = date.getTime();
  2. 时间毫秒值怎么恢复成日期对象
    • Date date = new Date(time);
    • date.setTime(time);

SimpleDateFormat

SimpleDateFormat 类作用

  • 可以对 Date 对象或时间毫秒值格式化成我们喜欢的时间格式。

  • 也可以把字符串的时间形式解析成日期对象。

    JAVA基础加强篇07——日期与时间_第4张图片

时间形式一:日期类表示时间的代码:

JAVA基础加强篇07——日期与时间_第5张图片

控制台输出

JAVA基础加强篇07——日期与时间_第6张图片

开发中常见的时间形式

JAVA基础加强篇07——日期与时间_第7张图片

SimpleDateFormat 的构造器

在这里插入图片描述
)]

SimpleDateFormat 的格式化方法

在这里插入图片描述

格式化的时间形式的常用的模式对应关系如下:

JAVA基础加强篇07——日期与时间_第8张图片

/**
 * 目标:simpleDateFormat 简单日期格式化类的使用
 * 格式化时间
 * 解析时间
 */
public class SimpleDateFormatTest1 {
    public static void main(String[] args) {
        //1、日期对象
        Date date = new Date();
        System.out.println(date);

        //2、格式化这个日期对象(指定最终格式化的形式)
        //EEE 代表周几,a 代表当前时间是上午还是下午
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss EEE a");
        //3、开始格式化日期对象成为喜欢的字符串形式
        String rs = simpleDateFormat.format(date);
        System.out.println(rs);

        System.out.println("------------------------------");

        //4、格式化时间毫秒值
        //需求:请问121秒后的时间是多少?
        long time1 = System.currentTimeMillis() + 121 * 1000;
        String rs2 = simpleDateFormat.format(time1);
        System.out.println(rs2);
    }
}

SimpleDateFormat 解析字符串时间成为日期对象

在这里插入图片描述

案例

  • 请计算出 2021年08月06日11点11分11秒,往后走 2天14小时49分06 秒后的时间是多少。

    /**
     * 目标:学会使用 SimpleDateFormat 解析字符串时间成为日期对象。
     * 请计算出 2021年08月06日11点11分11秒,往后走 2天14小时49分06 秒后的时间是多少。
     */
    public class SimpleDateFormatTest2 {
        public static void main(String[] args) throws ParseException {
            // 1、把字符串时间拿到程序中去
            String dateStr = "2021年08月06日 11:11:11";
            // 2、把字符串时间解析成日期对象(本节的重点):形式必须与被解析时间的形式完全一样,否则运行时解析报错!
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
            Date d = simpleDateFormat.parse(dateStr);
            // 3、往后走2天14小时49分06秒
            long time = d.getTime() + (2L*24*60*60 +14*60*60 + 49*60 +6) * 1000;
            // 4、格式化这个时间毫秒值就是结果
            System.out.println(simpleDateFormat.format(time));
        }
    }
    

总结

  1. SimpleDateFormat 可以格式化哪些时间形式?

    在这里插入图片描述

  2. SimpleDateFormat 如何进行字符串时间的解析的?

    在这里插入图片描述

练习 秒杀活动

需求

JAVA基础加强篇07——日期与时间_第9张图片

  • 小贾下单并付款的时间为:2022年11月11日 0:03:47
  • 小皮下单并付款的时间为:2020年11月11日 0:10:11
  • 用代码说明这两位同学有没有参加上秒杀活动?

分析

  • 判断下单时间是否在开始到结束的范围内。
  • 把字符串形式的时间变成毫秒值。
/**
 * 案例 秒杀活动
 * - 小贾下单并付款的时间为:2022年11月11日 0:03:47
 * - 小皮下单并付款的时间为:2020年11月11日 0:10:11
 * - 用代码说明这两位同学有没有参加上秒杀活动?
 */
public class SimpleDateFormatTest3 {
    public static void main(String[] args) throws ParseException {
        // 1、开始  和  结束 时间
        String startTime = "2022-11-11 00:00:00";
        String endTime = "2022-11-11 00:10:00";
        // 2、小贾 小皮
        String xiaoJia = "2022-11-11 00:03:47";
        String xiaoPi = "2022-11-11 00:10:11";
        // 3、解析他们的时间
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date d1 = simpleDateFormat.parse(startTime);
        Date d2 = simpleDateFormat.parse(endTime);
        Date d3 = simpleDateFormat.parse(xiaoJia);
        Date d4 = simpleDateFormat.parse(xiaoPi);
        // 4、判断 小贾 小皮 是否秒杀成功
        if (d3.after(d1) && d3.before(d2)){
            System.out.println("小贾秒杀成功,可以发货了!");
        }else {
            System.out.println("小贾秒杀失败!");
        }
        if (d4.after(d1) && d4.before(d2)){
            System.out.println("小皮秒杀成功,可以发货了!");
        }else {
            System.out.println("小皮秒杀失败!");
        }
    }
}

Calendar

Calendar 概述

  • Calendar 代表了系统此刻日期对应的日历对象。
  • Calendar 是一个抽象类,不能直接创建对象。

Calendar 日历类创建日历对象的方法:

在这里插入图片描述

Calendar 常用方法

JAVA基础加强篇07——日期与时间_第10张图片

注意:Calendar 是可变日期对象,一旦修改后其对象本身表示的时间将产生变化。

/**
 * 掌握 Calendar 日历常用方法
 */
public class CalendarTest {
    public static void main(String[] args) {
        // 1、拿到系统此刻的日历对象
        Calendar calendar = Calendar.getInstance();
        System.out.println(calendar);
        // 2、获取日历的信息: public int get(int field) 获取日期中的某个字段信息。
        int year = calendar.get(Calendar.YEAR);//获取年
        System.out.println(year);
        int month = calendar.get(Calendar.MONTH) + 1;//获取月
        System.out.println(month);
        int day = calendar.get(Calendar.DATE);//获取天
        System.out.println(day);
        int days = calendar.get(Calendar.DAY_OF_YEAR);//获取一年的第几天
        System.out.println(days);
        // 3、 public void set(int field, int value) :修改日期的某个字段信息。
//        calendar.set(Calendar.HOUR,12);
//        System.out.println(calendar); //一般不去修改,牵一发动全身,影响下面代码
        // 4、 public void add(int field, int amount); :为某个字段增加/减少指定的值。
        // 请问64天后是什么时间
        calendar.add(Calendar.DAY_OF_YEAR,64);//64天以后
        calendar.add(Calendar.MINUTE,59);//59分以后
        // 5、 public final Date getTime() :拿到此刻日期对象。
        Date date = calendar.getTime();
        System.out.println(date);//获取64天59分以后的日期
        // 6、public long getTimeInMillis() :拿到此刻时间毫秒值
        long time = calendar.getTimeInMillis();
        System.out.println(time);
    }
}

总结

  1. Calendar 如何去得到日历对象的?

    在这里插入图片描述

JDK8 新增日期类

概述、LocalTime/LocalDate/LocalDateTime

概述

  • 从 Java8 开始,java.time 包提供了新的日期和时间 API,主要涉及的类型有:

    JAVA基础加强篇07——日期与时间_第11张图片

  • 新增的 API 严格区分了时刻、本地日期、本地时间,并且,对日期和时间进行运算更加方便。

  • 其次,新的 API 的类型几乎全部是不变类型(和 String 的使用类似),可以放心使用不必担心被修改。

LocalDate、LocalTime、LocalDateTime

  • 他们分别表示日期、时间、日期时间对象,他们的类的实例是不可变的对象。
  • 他们三者构建对象和 API 都是通用的

构建对象的方式如下:

JAVA基础加强篇07——日期与时间_第12张图片

LocalDate、LocalTime、LocalDateTime获取信息的 API

JAVA基础加强篇07——日期与时间_第13张图片

转换相关的 API

JAVA基础加强篇07——日期与时间_第14张图片

LocalDateTime 的转换 API

JAVA基础加强篇07——日期与时间_第15张图片

LocalDate 代码

/**
 * 掌握 LocalDate
 */
public class Test1LocalDate {
    public static void main(String[] args) {
        // 1、获取本地日期对象
        LocalDate nowDate = LocalDate.now();
        System.out.println("今天的日期:" + nowDate);// 今天的日期
        // 2、获取年
        int year = nowDate.getYear();
        System.out.println("year:" + year);
        // 3、获取月
        int month = nowDate.getMonthValue();
        System.out.println("month:" + month);
        // 4、获取天
        int day = nowDate.getDayOfMonth();
        System.out.println("day:" + day);
        // 5、获取当年的第几天
        int dayOfYear = nowDate.getDayOfYear();
        System.out.println("dayOfYear:" + dayOfYear);
        // 6、星期
        System.out.println(nowDate.getDayOfWeek());//英文 FRIDAY
        System.out.println(nowDate.getDayOfWeek().getValue());//数字 5
        // 7、月份
        System.out.println(nowDate.getMonth());//英文 JUNE
        System.out.println(nowDate.getMonth().getValue());//数字 6

        System.out.println("----------------------------");

        LocalDate bt = LocalDate.of(1991, 11, 11);
        System.out.println(bt);//直接传入对应的年月日
        System.out.println(LocalDate.of(1991, Month.NOVEMBER,11));
    }
}

LocalTime 代码

/**
 * 掌握 LocalTime
 */
public class Test2LocalTime {
    public static void main(String[] args) {
        // 1、获取本地时间对象
        LocalTime nowTime = LocalTime.now();
        System.out.println("今天的时间:" + nowTime);//今天的时间
        // 2、获取时
        int hour = nowTime.getHour();
        System.out.println("hour:" + hour);
        // 3、获取分
        int minute = nowTime.getMinute();
        System.out.println("minute:" + minute);
        // 4、获取秒
        int second = nowTime.getSecond();
        System.out.println("second:" + second);
        // 5、获取纳秒
        int nano = nowTime.getNano();
        System.out.println("nano:" + nano);

        System.out.println("---------------------------");

        System.out.println(LocalTime.of(8,20));//时分
        System.out.println(LocalTime.of(8,20,30));//时分秒
        System.out.println(LocalTime.of(8,20,30,150));//时分秒纳秒
        LocalTime mTime = LocalTime.of(8, 20, 30, 150);

        System.out.println("-------------------------");

        System.out.println(LocalDateTime.of(1991,11,11,8,20));
        System.out.println(LocalDateTime.of(1991, Month.NOVEMBER,11,8,20));
        System.out.println(LocalDateTime.of(1991, 11,11,8,20,30));
        System.out.println(LocalDateTime.of(1991, Month.NOVEMBER,11,8,20,30));
        System.out.println(LocalDateTime.of(1991, 11,11,8,20,30,000000150));
        System.out.println(LocalDateTime.of(1991, Month.NOVEMBER,11,8,20,30,000000150));
    }
}

LocalDateTime代码

/**
 * 掌握 LocalDateTime
 */
public class Test3LocalDateTime {
    public static void main(String[] args) {
        // 1、 日期 时间
        LocalDateTime nowDateTime = LocalDateTime.now();
        System.out.println("今天是:" + nowDateTime);//今天
        // 2、年
        System.out.println(nowDateTime.getYear());
        // 3、月
        System.out.println(nowDateTime.getMonthValue());
        // 4、日
        System.out.println(nowDateTime.getDayOfMonth());
        // 5、时
        System.out.println(nowDateTime.getHour());
        // 6、分
        System.out.println(nowDateTime.getMinute());
        // 7、秒
        System.out.println(nowDateTime.getSecond());
        // 8、纳秒
        System.out.println(nowDateTime.getNano());
        // 9、今年的第几天
        System.out.println("dayOfYear:" + nowDateTime.getDayOfYear());
        // 10、星期
        System.out.println(nowDateTime.getDayOfWeek());
        System.out.println(nowDateTime.getDayOfWeek().getValue());
        // 11、月份
        System.out.println(nowDateTime.getMonth());
        System.out.println(nowDateTime.getMonth().getValue());

        LocalDate localDate = nowDateTime.toLocalDate();
        System.out.println(localDate);

        LocalTime localTime = nowDateTime.toLocalTime();
        System.out.println(localTime.getHour());
        System.out.println(localTime.getMinute());
        System.out.println(localTime.getSecond());
    }
}

修改相关的 API

  • LocalDateTime 综合了 LocalDate 和 LocalTime 里面的方法,所以下面只用 LocalDate 和 LocalTime 来举例。

  • 这些方法返回的是一个新的实例引用,因为 LocalDateTime、LocalDate、LocalTime 都是不可变的。

    JAVA基础加强篇07——日期与时间_第16张图片

    /**
     * 掌握 时间的计算
     */
    public class Test4UpdateTime {
        public static void main(String[] args) {
            LocalTime nowTime = LocalTime.now();
            System.out.println(nowTime);//当前时间
            System.out.println("--------------------------");
            System.out.println(nowTime.minusHours(1));// 1小时前
            System.out.println(nowTime.minusMinutes(1));// 1分钟前
            System.out.println(nowTime.minusSeconds(1));// 1秒前
            System.out.println(nowTime.minusNanos(1));// 1纳秒前
            System.out.println("--------------------------");
            //不可变对象,每次修改产生新对象!
            System.out.println(nowTime);
            System.out.println("--------------------------");
            LocalDate myDate = LocalDate.of(2018, 9, 5);
            LocalDate nowDate = LocalDate.now();
            System.out.println("今天是2018-09-06吗?" + nowDate.equals(myDate));
            System.out.println(myDate + "是否在" + nowDate + "之前?" + myDate.isBefore(nowDate));
            System.out.println(myDate + "是否在" + nowDate + "之后?" + myDate.isAfter(nowDate));
            System.out.println("--------------------------");
            LocalDate birDate = LocalDate.of(1991, 6, 12);
            LocalDate nowDate1 = LocalDate.now();
            MonthDay birMd = MonthDay.of(birDate.getMonthValue(), birDate.getDayOfMonth());
            MonthDay nowMd = MonthDay.from(nowDate1);
            System.out.println("今天是你的生日吗?" + birMd.equals(nowMd));
        }
    }
    

Instant

Instant 时间戳

  • JDK8 获取时间戳特别简单,且功能更丰富。Instant 类由一个静态的工厂方法 now() 可以返回当前时间戳。

    JAVA基础加强篇07——日期与时间_第17张图片

  • 时间戳是包含日期和时间的,与 java.util.Date 很类似,事实上 Instant 就是类似 JDK8 以前的 Date。

  • Instant 和 Date 这两个类可以进行转换。

    /**
     * 掌握时间戳 instant
     */
    public class Test5Instant {
        public static void main(String[] args) {
            // 1、得到一个 Instant 时间戳对象
            Instant instant = Instant.now();//世界标准时间 与 中国时间 差 8 小时
            System.out.println(instant);
    
            // 2、系统此刻的时间戳怎么办?
            Instant instant1 = Instant.now();
            System.out.println(instant1.atZone(ZoneId.systemDefault()));
    
            // 3、如何去返回 Date 对象  Instant 和 Date 转换
            Date date = Date.from(instant);
            System.out.println(date);
    
            Instant instant2 = date.toInstant();
            System.out.println(instant2);
        }
    }
    

DateTimeForMatter

DateTimeForMatter

  • 在 JDK8 中,引入了一个全新的日期与时间格式器 DateTimeFormatter

  • 正反都调用 format 方法。

    JAVA基础加强篇07——日期与时间_第18张图片

/**
 * 掌握 DateTimeForMatter
 */
public class Test6DateTimeFormat {
    public static void main(String[] args) {
        //本地此刻 日期时间 对象
        LocalDateTime now = LocalDateTime.now();
        System.out.println(now);

        //解析/格式化器
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss EEE a");
        //正向格式化
        System.out.println(dateTimeFormatter.format(now));
        //逆向格式化
        System.out.println(now.format(dateTimeFormatter));

        //解析字符串时间
        DateTimeFormatter dateTimeFormatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        //解析当前字符串时间称为本地日期时间对象
        LocalDateTime dateTime = LocalDateTime.parse("2019-11-11 11:11:22", dateTimeFormatter1);
        System.out.println(dateTime);
        System.out.println(dateTime.getDayOfYear());
    }
}

Duration/Period

Period

  • 在 Java8 中,我们可以使用以下类来计算日期间隔差异:java.time.Period

  • 主要是 Period 类方法 getYears(),getMonths() 和 getDays() 来计算,只能精确到年月日。

  • 用于 LocalDate 之间的比较。

    JAVA基础加强篇07——日期与时间_第19张图片

/**
 * 掌握 Period 计算日期间隔
 */
public class Test7Period {
    public static void main(String[] args) {
        // 当前本地 年月日
        LocalDate today = LocalDate.now();
        System.out.println(today);

        //生日的 年月日
        LocalDate birthDate = LocalDate.of(2002, 10, 8);
        System.out.println(birthDate);

        Period period = Period.between(birthDate, today);//第二个参数减第一个参数
        System.out.println(period.getYears());
        System.out.println(period.getMonths());
        System.out.println(period.getDays());
    }
}

Duration

  • 在 Java8 中,我们可以使用以下类来计算时间间隔差异:java.time.Duration

  • 提供了使用基于时间的测量时间量的方法。

  • 用于 LocalDateTime 之间的比较。也可用于 Instant 之间的比较。

    JAVA基础加强篇07——日期与时间_第20张图片

/**
 * 掌握 Duratio 时间间隔
 */
public class Test8Duration {
    public static void main(String[] args) {
        //本地日期时间对象。
        LocalDateTime today = LocalDateTime.now();
        System.out.println(today);

        //出生的日期时间对象
        LocalDateTime birthDate = LocalDateTime.of(2002, 10, 8, 00, 00, 00, 00);
        System.out.println(birthDate);

        Duration duration = Duration.between(birthDate,today);//第二个采纳数减第一个参数
        System.out.println(duration.toDays());//两个时间差的天数
        System.out.println(duration.toHours());//两个时间差的小时数
        System.out.println(duration.toMinutes());//两个时间差的分钟数
        System.out.println(duration.toMillis());//两个时间差的毫秒数
        System.out.println(duration.toNanos());//两个时间差的纳秒数
    }
}

总结

  1. Duration:用于计算两个 “时间” 间隔。
  2. Period:用于计算两个 “日期” 间隔。

ChronoUnit

Java.time.temporal.ChronoUnit

  • ChronoUnit 类可用于在单个时间单位内测量一段时间,这个工具类是最全的了,可以用于比较所有的时间单位。

    JAVA基础加强篇07——日期与时间_第21张图片

/**
 * 掌握 ChronoUnit
 */
public class Test9ChronoUnit {
    public static void main(String[] args) {
        //本地日期时间对象:此刻的
        LocalDateTime today = LocalDateTime.now();
        System.out.println(today);

        //生日时间
        LocalDateTime birthDate = LocalDateTime.of(1990, 10, 1, 10, 50, 59);
        System.out.println(birthDate);

        System.out.println("相差的年数:" + ChronoUnit.YEARS.between(birthDate,today));
        System.out.println("相差的月数:" + ChronoUnit.MONTHS.between(birthDate,today));
        System.out.println("相差的周数:" + ChronoUnit.WEEKS.between(birthDate,today));
        System.out.println("相差的天数:" + ChronoUnit.DAYS.between(birthDate,today));
        System.out.println("相差的时数:" + ChronoUnit.HOURS.between(birthDate,today));
        System.out.println("相差的分数:" + ChronoUnit.MINUTES.between(birthDate,today));
        System.out.println("相差的秒数:" + ChronoUnit.SECONDS.between(birthDate,today));
        System.out.println("相差的毫秒数:" + ChronoUnit.MILLIS.between(birthDate,today));
        System.out.println("相差的微秒数:" + ChronoUnit.MICROS.between(birthDate,today));
        System.out.println("相差的纳秒数:" + ChronoUnit.NANOS.between(birthDate,today));
        System.out.println("相差的半天数:" + ChronoUnit.HALF_DAYS.between(birthDate,today));
        System.out.println("相差的十年数:" + ChronoUnit.DECADES.between(birthDate,today));
        System.out.println("相差的世纪(百年)数:" + ChronoUnit.CENTURIES.between(birthDate,today));
        System.out.println("相差的千年数:" + ChronoUnit.MILLENNIA.between(birthDate,today));
        System.out.println("相差的纪元数:" + ChronoUnit.ERAS.between(birthDate,today));
    }
}

你可能感兴趣的:(JAVA基础加强篇,java)