常用API-二

时间与日期

Date

Date类概述

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

Date的构造器

public Date() 创建一个Date对象,代表的是系统当前此刻日期时间。

Date的常用方法

public long getTime() 获取时间对象的毫秒值

public class DateDemo1 {
    public static void main(String[] args) {
        //1.创建一个Date类对象,代表系统此刻时间日期对象
        Date d = new Date();
        System.out.println(d);

        //2.获取时间的毫秒值
        long time = d.getTime();
        System.out.println(time);
        long time1 = System.currentTimeMillis();
        System.out.println(time1);
    }
}
output
Wed Jan 12 10:14:47 CST 2022
1641953687908
1641953687927

案例

  • 请计算出当前时间往后走1小时121秒之后 的时间是多少。
     //1.获取当前时间
        Date d2 = new Date();
        System.out.println(d2);

        //2.获取当前时间毫秒值,再往后走1小时112秒
        long time2 = System.currentTimeMillis();
        time2 += (60 * 60 + 112) * 1000;

        //3.将time2时间毫秒值转成当前对应的日期对象
//        Date d3 = new Date(time2);
//        System.out.println(d3);

        Date d3 = new Date();
        d3.setTime(time2);
        System.out.println(d3);                                                                                   

时间毫秒值 -> 日期对象

构造器:public Date(long time) 说明:把时间毫秒值转换成Date时期对象

Date方法:public void setTime(long time) 说明:设置日期对象的时间为当前时间毫秒值对应的时间

SimpleDateFormat

SimpleDateFormat 类作用

  • 可以对Date对象或时间毫秒值格式化成我们喜欢的时间形式
  • 也可以把字符串的时间形式解析成日期对象。

SimpleDateFormat的构造器

构造器:public SimpleDateFormat() 说明:构造一个SimpleDateFormat,使用默认格式。

public SimpleDateFormat(String pattern) 说明:构造一个SimpleDateFormat,使用指定的格式。

SimpleDateFormat 的格式化方法

格式化方法:public final String format(Date date) 将日期格式化成日期/时间字符串

public final String format(Objecr time) 将时间毫秒值化成日期/时间字符串

public class SimpleDateFormatDemo1 {
    public static void main(String[] args) {
        //1.日期对象
        Date d = new Date();
        System.out.println(d);

        //2.格式化这个日期对象(指定最终格式化形式)
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss EEE a");
        //3.开始格式化日期对象成为喜欢的字符串形式
        String rs = sdf.format(d);
        System.out.println(rs);
        System.out.println("-------------");

        //4.格式化时间毫秒值
        //需求:请问121秒后的时间是多少
        long time = System.currentTimeMillis() + 121 * 1000;
        String rs1 = sdf.format(time);
        System.out.println(rs1);
    }
}
output:
Wed Jan 12 10:48:17 CST 2022
2022年01月12日 10:48:17 星期三 上午
-------------
2022年01月12日 10:50:18 星期三 上午

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

解析方法:public Date parse(String source) 从给定的字符串的开始解析文本以生成日期

案例一

  • 请计算出2022年01月12日11点11分11秒,往后走2天14小时49分06秒后的时间是多少。
package com.csl.d2_simpledateformat;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 请计算出2022年01月12日11点11分11秒,往后走2天14小时49分06秒后的时间是多少。
 */
public class SimpleDateFormatDemo2 {
    public static void main(String[] args) throws ParseException {
        //1.把字符串时间拿到时间中来
        String dateStr = "2022年01月12日 11:11:11";

        //2.把字符串解析成日期对象:形式必须与被解析的时间的形式完全一样,否则运行时解析报错
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
        Date d = sdf.parse(dateStr);
        //3.往后走2天14小时49分06秒

        long time = d.getTime() + (2L * 24 * 60 * 60 + 14 * 60 * 60 + 49 * 60 + 6) * 1000;
        //格式化这个时间的毫秒值就是结果
        String format = sdf.format(time);
        System.out.println(format);
    }
}
output:
2022年01月15日 02:00:17

总结

  1. SimpleDateFormat可以格式化哪些形式?
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String str1 = sdf.format(date);//日期对象
String str1 = sdf.format(time);//时间毫秒值
  1. SimpleDateFormat如何进行字符串时间的解析的?
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date d = sdf.parse(("2022-01-12 11:11:11"));

案例二:秒杀活动

秒杀开始时间:2020年11月11日 0:0:0

秒杀结束时间 2020年11月11日 0:10:0

需求

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

分析

  • 判断下单时间是否在开始到结束的范围内
  • 把字符串形式的时间变成毫秒值
package com.csl.d2_simpledateformat;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class SimpleDateFormatTest {
    public static void main(String[] args) throws ParseException {
        //1.记录各自的时间
        String startTime = "2020-11-11 00:00:00";
        String endTime = "2020-11-11 00:10:00";
        String xaioBai = "2020-11-11 00:03:55";
        String xiaoHei = "2020-11-11 00:10:22";

        //2.解析他们的时间
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date d1 = sdf.parse(startTime);
        Date d2 = sdf.parse(endTime);
        Date d3 = sdf.parse(xaioBai);
        Date d4 = sdf.parse(xiaoHei);
        
        //3.做判断
        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("小黑秒杀失败!");
        }
    }
}
output:
小白秒杀成功,可以发货!
小黑秒杀失败!

Calendar

Calendar概述

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

Calendar常用方法

public class CalendarDemo {
    public static void main(String[] args) {
        //1.拿到系统此时日历对象
        Calendar cal = Calendar.getInstance();
        System.out.println(cal);
        //2.获取日历的信息。
        int year = cal.get(Calendar.YEAR);
        System.out.println(year);
        int mm = cal.get(Calendar.MONTH) + 1;
        System.out.println(mm);
        //3.public void set(int filed,int value):修改日历的某个字段信息
        cal.set(Calendar.HOUR,12);
        System.out.println(cal);
        //4.public void add(int filed,int amount):为某个字段增加/减少指定的值
        //请问64天后是什么日期
        cal.add(Calendar.DAY_OF_YEAR,64);
        cal.add(Calendar.MINUTE,59);
        //5.public final Date getTime():拿到此刻日期对象
        Date d = cal.getTime();
        System.out.println(d);
        //6.public long getTimeMillis():拿到此刻时间毫秒值
        long time = cal.getTimeInMillis();
        System.out.println(time);
    }
}
output:
java.util.GregorianCalendar[time=1641959614206,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=31,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2022,MONTH=0,WEEK_OF_YEAR=3,WEEK_OF_MONTH=3,DAY_OF_MONTH=12,DAY_OF_YEAR=12,DAY_OF_WEEK=4,DAY_OF_WEEK_IN_MONTH=2,AM_PM=0,HOUR=11,HOUR_OF_DAY=11,MINUTE=53,SECOND=34,MILLISECOND=206,ZONE_OFFSET=28800000,DST_OFFSET=0]
2022
1
java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=31,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2022,MONTH=0,WEEK_OF_YEAR=3,WEEK_OF_MONTH=3,DAY_OF_MONTH=12,DAY_OF_YEAR=12,DAY_OF_WEEK=4,DAY_OF_WEEK_IN_MONTH=2,AM_PM=0,HOUR=12,HOUR_OF_DAY=11,MINUTE=53,SECOND=34,MILLISECOND=206,ZONE_OFFSET=28800000,DST_OFFSET=0]
Thu Mar 17 13:52:34 CST 2022
1647496354206

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

JDK8新增日期类

概述、

概述

  • 从Java8开始,java.time包提供了新的日期和时间API,主要涉及的类型有:
    • LocalDate:不包含具体时间的日期
    • LocalTime:不包含日期的时间
    • LocalDateTime:包含日期及时间
    • Instant:代表的是时间戳
    • DateTimeFormatter:用于做时间的格式化和解析的
    • Duration:用于计算两个 “时间” 的间隔
    • Period:用于计算两个 “日期“ 的间隔
  • 新增的API严格区分了时刻、本地日期、本地时间、并且,对日期和时间进行运算更加方便
  • 其次,新API的类型几乎全部都是不变类型(和String的使用类似),可以放心使用不必担心被修改

LocalTime/LocalDate/LocalDateTime

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

修改相关的API

  • LocalDateTime 综合了LocalDate和LocalTime 里面的方法,所以下面只用LocalDate和LocalTime来举例
  • 这些方法返回的是一个新的实例引用,因为LocalDateTime、LocalDate、LocalTime都是不可变的
    | 方法名 | 说明 |
    | plusDays,plusWeeks,plusMonth,plusYears | 向当前LocalDate对象添加几天、几周、几个月、几年 |
    | minusDays,minusWeeks,minusMonth,minusYears | 从当前LocalDate对象减去几天、几周、几个月、几年 |
    | withDayOfMonth,withDayOfYear,withMonth,withYear | 将月份天数、年份天数、月份、年份修改为指定的值并返回新的LocalDate对象 |
    | isBefore,isAfter | 比较两个LocalDate |
package com.csl.d4_jdk8_api;

import java.time.LocalDate;
import java.time.LocalTime;
import java.time.Month;
import java.time.MonthDay;

public class Demo01UpdateTime {
    public static void main(String[] args) {
        LocalTime nowTime = LocalTime.now();
        System.out.println(nowTime);
        System.out.println(nowTime.minusHours(1));
        System.out.println(nowTime.minusMinutes(1));
        System.out.println(nowTime.minusSeconds(1));
        System.out.println(nowTime.minusNanos(1));

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

        System.out.println(nowTime.plusHours(1));
        System.out.println(nowTime.plusMinutes(1));
        System.out.println(nowTime.plusSeconds(1));
        System.out.println(nowTime.plusNanos(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-05吗?" + 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(1996, 1, 12);
        LocalDate nowDate1 = LocalDate.now();
        MonthDay birMd = MonthDay.of(birDate.getMonthValue(), nowDate1.getDayOfMonth());
        MonthDay nowMd = MonthDay.from(nowDate1);
        System.out.println("今天是你的生日吗?" + birMd.equals(nowMd));
    }
}
output:
14:24:56.480
13:24:56.480
14:23:56.480
14:24:55.480
14:24:56.479999999
---------------
15:24:56.480
14:25:56.480
14:24:57.480
14:24:56.480000001
-------------
14:24:56.480
-----------------
今天是2018-09-05吗?false
2018-09-05是否在2022-01-12之前true
2018-09-05是否在2022-01-12之后false
----------------
今天是你的生日吗?true

Instant

Instant时间戳

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

public class InstantDemo1 {
    public static void main(String[] args) {
        //1、得到一个Instant时间戳对象
        Instant instant = Instant.now();
        System.out.println(instant);

        //2.系统此刻时间戳
        Instant instant1 = Instant.now();
        System.out.println(instant1.atZone(ZoneId.systemDefault()));

        //3.如何去返回Date对象
        Date date = Date.from(instant);
        System.out.println(date);

        Instant instant2 = date.toInstant();
        System.out.println(instant2);
    }
}
output:
2022-01-12T06:38:17.701Z
2022-01-12T14:38:17.784+08:00[Asia/Shanghai]
Wed Jan 12 14:38:17 CST 2022
2022-01-12T06:38:17.701Z

  • 时间戳是包含日期和时间的,与Java.util.Date很类似,事实上Instant就是类似JDK8 以前的Date。
  • Instant和Date这两个类可以进行转换

DateTimeFormatter

  • 在JDK8中,引入了一个全新的日期与时间格式器DateTimeFormatter
  • 正反都能调用format()方法。
package com.csl.datetimeformatter;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

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

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

        //解析字符串时间
        DateTimeFormatter dtf1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        //解析当前字符串时间成为本地日期时间对象
        LocalDateTime ldt1 = LocalDateTime.parse("2022-01-12 11:11:11",dtf1);
        System.out.println(ldt1);
        System.out.println(ldt1.getDayOfYear());
    }
}
output:
2022-01-12T14:54:02.490
2022-01-12 14:54:02 星期三 下午
2022-01-12 14:54:02 星期三 下午
2022-01-12T11:11:11
12

Duration/Period

Period

  • 在Java8中,我们可以使用以下类来计算日期间隔差异:java.time.Period
  • 主要是Period类方法getYears(),getMonths(),getDays()来计算,只能精确到年月日
  • 用于LocalDate之间比较
import java.time.LocalDate;
import java.time.Period;

public class Demo02Period {
    public static void main(String[] args) {
        //当前本地  年月日
        LocalDate today = LocalDate.now();
        System.out.println(today);

        //生日的   年月日
        LocalDate birDate = LocalDate.of(1996,12,12);
        Period period = Period.between(birDate,today);//第二个参数减去第一个
        System.out.println(period.getYears());
        System.out.println(period.getMonths());
        System.out.println(period.getDays());
    }
}
output:
2022-01-12
25
1
0

Duration

  • 在Java8中,我们可以使用以下类来计算时间间隔差异:java.time.Duration
  • 提供了使用基于时间的值测量时间量的方法
  • 用于LocalDateTime 之间的比较。也可用于Instant 之间的比较
package com.csl.d4_jdk8_api;

import java.time.Duration;
import java.time.LocalDate;
import java.time.LocalDateTime;

public class Demo03Duration {
    public static void main(String[] args) {
        //本地日期时间对象
        LocalDateTime today = LocalDateTime.now();
        System.out.println(today);

        //出生日期时间对象
        LocalDateTime birDate = LocalDateTime.of(1996,12,12,12,07,23);
        Duration duration = Duration.between(birDate,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());
    }
}
output:
2022-01-12T15:06:42.036
9162
219890
13193459
791607559036
791607559036000000

ChronoUnit

java.time.temporal.ChronoUnit

  • ChronoUnit类可用于在单个时间单位内测量一段时间,这个工具类是最全的了,可用于比较所有的时间单位
package com.csl.d4_jdk8_api;
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;

public class ChronoUnitDemo {
    public static void main(String[] args) {
        LocalDateTime today = LocalDateTime.now();
        System.out.println(today);

        LocalDateTime birDate = LocalDateTime.of(1996,12,12,12,05,01);
        System.out.println(birDate);

        System.out.println("相差的年数:"+ChronoUnit.YEARS.between(birDate, today));
        System.out.println("相差的月数:"+ChronoUnit.MONTHS.between(birDate, today));
        System.out.println("相差的周数:"+ChronoUnit.WEEKS.between(birDate, today));
        System.out.println("相差的天数:"+ChronoUnit.DAYS.between(birDate, today));
        System.out.println("相差的小时数:"+ChronoUnit.HOURS.between(birDate, today));
        System.out.println("相差的分钟数:"+ChronoUnit.MINUTES.between(birDate, today));
        System.out.println("相差的秒数:"+ChronoUnit.SECONDS.between(birDate, today));
        System.out.println("相差的毫秒数:"+ChronoUnit.MILLIS.between(birDate, today));
        System.out.println("相差的微秒数:"+ChronoUnit.MICROS.between(birDate, today));
        System.out.println("相差的纳秒数:"+ChronoUnit.NANOS.between(birDate, today));
        System.out.println("相差的半天数:"+ChronoUnit.HALF_DAYS.between(birDate, today));
        System.out.println("相差的十年数:"+ChronoUnit.DECADES.between(birDate, today));
        System.out.println("相差的世纪(百年)数:"+ChronoUnit.CENTURIES.between(birDate, today));
        System.out.println("相差的千年数:"+ChronoUnit.MILLENNIA.between(birDate, today));
        System.out.println("相差的纪元数:"+ChronoUnit.ERAS.between(birDate, today));
    }
}
output:
2022-01-12T15:32:38.318
1996-12-12T12:05:01
相差的年数:25
相差的月数:301
相差的周数:1308
相差的天数:9162
相差的小时数:219891
相差的分钟数:13193487
相差的秒数:791609257
相差的毫秒数:791609257318
相差的微秒数:791609257318000
相差的纳秒数:791609257318000000
相差的半天数:18324
相差的十年数:2
相差的世纪(百年)数:0
相差的千年数:0
相差的纪元数:0
posted @ 2022-01-12 15:38  tryAgainCs  阅读(50)  评论(0编辑  收藏  举报