01-时间日期类-概述
1 现实生活中的时间
- 了解:世界标准时间:格林尼治标准时间(Greenwich Mean Time,GMT),现在用原子钟计算
- 英国格林威治(Greenwich)天文台原址子午仪中心的经线为本初子午线。 -> 本初子午线
- 本初子午线 -> 地球的0°经线
- 格林尼治标准时间(Greenwich Mean Time,GMT)
- GMT标准时间的正午是指当太阳横穿格林尼治子午线时的时间
- 地球经度从本初子午线向东180°(时间早于0°),向西180°(时间晚于0°),一共360°
- 时区(Time Zone):
- 地球自转一天是24小时,按经度分为24个时区;360°÷24=15°(每15°一个时区)
- 由于地球自转的不规则,时间不准确,所以使用原子钟计算出来的时间作为标准时间
- 了解:中国标准时间=世界标准时间+8小时
北京所在时区为东八区,中国标准时间整体采用北京时间
- 问题:现实生活中【秒级别】的单位有哪些?这些单位之间如何换算?
1秒=1000毫秒
1毫秒=1000微秒
1微秒=1000纳秒
2 计算机中的时间
- 问题:计算机中的时间原点?
1970年1月1日 0时0分0秒
- 问题:System.currentTimeMillis();获取的毫秒数是什么?
从计算机时间原点到当前【系统】时间的毫秒值
02-时间日期类-Date构造方法
注意:java.util.Date
- 问题:两个构造方法的【作用】?
public Date() // 用系统当前时间构造Date对象
public Date(long date)// 用指定时间的毫秒值构造Date对象,时差
- 扩展:Date对象表示的日期时间,有时差、Date对象空参构造
1.时差
系统当前的时区
2.Date类的空参构造
public Date() {
this(System.currentTimeMillis());
}
03-时间日期类-Date成员方法
- 问题:两个成员方法有什么【作用】?
public long getTime() // 获取毫秒值
public void setTime(long time) // 用参数指定的毫秒值修改当前对象
04-时间日期类-SimpleDateFormat
- 问题:SimpleDateFormat有参构造,传入字符串中的字母分别代表什么意思?
有参构造:public SimpleDateFormat(String pattern)
参数:"yyyy-MM-dd HH:mm:ss"
// 其他没介绍的不常用的 可以查API
【格式】:除了字母都可以替换
- 问题:SimpleDateFormat两个成员方法都有什么【作用】?调用parse方法解析时,有什么注意事项?
public final String format(Date date) // 格式化(日期对象 -> 字符串)【格式】
public Date parse(String source)// 解析(字符串 -> 日期对象)【格式】
注意事项:
解析时,如果格式不匹配,会抛异常
- SimpleDateFormat的使用
1.创建对象
// 拿到这个格式
2.两个成员方法
格式化(日期对象 -> 字符串)【格式】
解析(字符串 -> 日期对象)【格式】
05-时间日期类-练习
- 练习
秒杀开始时间2020年11月11日 00:00:00
秒杀结束时间2020年11月11日 00:10:00
小贾同学下单时间2020年11月11日 00:03:47
小皮同学下单时间2020年11月11日 00:10:11
需求:用代码判断小贾和小皮 谁参加到了活动
考察:毫秒、Date类、SimpleDateFormat类
思路:
- 将字符串转换成Date类型:SimpleDateFormat
- 获取Date类型的毫秒值
- 用毫秒值进行大小比较
- 小结:Date类、毫秒值、SimpleDateFormat类
毫秒值 -> Date对象
1.new Date(毫秒值)
2.date.setTime(毫秒值)
Date对象 -> 毫秒值
date.getTime();
Date对象 -> 字符串 【格式】SimpleDateFormat对象
SimpleDateFormat对象.format(date);
字符串 -> Date对象 【格式】SimpleDateFormat对象
SimpleDateFormat对象.parse(字符串);
// 字符串用来展示
// 毫秒值用来计算
06-时间日期类-JDK8的体验
JDK8日期时间处理,比Date类更加方便,提供的API也更丰富
07-JDK8时间类-获取时间对象
- 三个主要的类
- LocalDateTime 日期 时间
- LocalDate 日期
- LocalTime 时间
- 静态方法:now、of
- 系统当前日期时间
public static LocalDateTime now()
- 指定日期时间
public static LocalDateTime of(int year, int month, int dayOfMonth, int hour, int minute, int second)
public static LocalDateTime of(年, 月, 日, 时, 分, 秒)
- 扩展:时区
- 指定时区
public static LocalDateTime now(ZoneId zone)
- 时区格式:
ZoneId.of("洲名/国家名");
- 例:
LocalDateTime.now(ZoneId.of("Europe/London"));
08-JDK8时间类-获取时间中的每一个值
get系列
- 年
public int getYear() 获取年
- 月
public Month getMonth() 获取月份(1-12)【枚举】
public int getMonthValue() 获取月份(1-12)
- 天
public int getDayOfMonth() 获取一个月中的第几天(1-31)
public int getDayOfYear() 获取一年中的第几天(1-366)
- 星期
public DayOfWeek getDayOfWeek() 获取星期(星期一 - 星期日)【枚举】
- 时
public int getHour() 获取小时(0-23)
- 分
public int getMinute() 获取分钟(0-59)
- 秒
public int getSecond() 获取分钟(0-59)
09-JDK8时间类-转换方法
to系列
- LocalDateTime 转换 LocalDate
public LocalDate toLocalDate() 年月日
- LocalDateTime 转换 LocalTime
public LocalTime toLocalTime() 时分秒
10-JDK8时间类-格式化和解析
- JDK8格式化解析类,DateTimeFormatter
- 定义:
public static DateTimeFormatter ofPattern(String pattern)
- 说明:
参数:【格式】
返回值:格式化对象
- 格式化和解析
注意:格式化和解析方法是谁的方法
- 格式化:
- 定义:
public String format(DateTimeFormatter formatter)
- 说明:
参数:格式化对象
返回值:格式化后的字符串
作用:按照一定【格式】将日期格式化后的字符串
- 解析:
- 定义:
public static LocalDateTime parse(CharSequence text, DateTimeFormatter formatter)
-说明:
参数:字符串,格式化对象
返回值:解析后的日期时间对象
作用:按照一定的【格式】将字符串转换成日期时间对象
- 格式化和解析与Date类比较
- 日期格式化类:
Date -> SimpleDateFormat
LocalDateTime -> DateTimeFormatter
- 格式化解析方法: format(格式化)、parse(解析)
SimpleDateFormat 是方法的调用者
LocalDateTime 是方法的调用者
11-JDK8时间类-plus系列方法
plus系列:作用
public LocalDateTime plusYears (long years) 添加或者减去年
public LocalDateTime plusMonths(long months) 添加或者减去月
public LocalDateTime plusDays(long days) 添加或者减去日
public LocalDateTime plusHours(long hours) 添加或者减去时
public LocalDateTime plusMinutes(long minutes) 添加或者减去分
public LocalDateTime plusSeconds(long seconds) 添加或者减去秒
public LocalDateTime plusWeeks(long weeks) 添加或者减去周
- 属于LocalDateTime类的成员方法
- 参数:
正数:当前LocalDateTime对象,时间向后加指定值
负数:当前LocalDateTime对象,时间向前减指定值
- 返回值:
返回新的LocalDateTime对象,新对象的日期时间,是原来对象日期时间加减后的值
12-JDK8时间类-minus系列方法
minus系列:作用,与plus相似
public LocalDateTime minusYears (long years) 减去或者添加年
public LocalDateTime minusMonths(long months) 减去或者添加月
public LocalDateTime minusDays(long days) 减去或者添加日
public LocalDateTime minusHours(long hours) 减去或者添加时
public LocalDateTime minusMinutes(long minutes) 减去或者添加分
public LocalDateTime minusSeconds(long seconds) 减去或者添加秒
public LocalDateTime minusWeeks(long weeks) 减去或者添加周
- 方法:
- 属于LocalDateTime类成员方法
- 参数:
正数:当前LocalDateTime对象,时间向前减指定值
负数:当前LocalDateTime对象,时间向后加指定值
- 返回值:
返回新的LocalDateTime对象,新对象的日期时间,是原来对象日期时间加减后的值
13-JDK8时间类-with系列方法
with系列:作用,修改时间
public LocalDateTime withYear(int year) 直接修改年
public LocalDateTime withMonth(int month) 直接修改月
public LocalDateTime withDayOfMonth(int dayofmonth) 直接修改日期(一个月中的第几天)
public LocalDateTime withDayOfYear(int dayOfYear) 直接修改日期(一年中的第几天)
public LocalDateTime withHour(int hour) 直接修改小时
public LocalDateTime withMinute(int minute) 直接修改分钟
public LocalDateTime withSecond(int second) 直接修改秒
- 方法:
- 属于LocalDateTime类成员方法
- 返回值:
返回新的LocalDateTime对象,新对象的日期时间,是原来对象日期时间加减后的值
- 设置的值超出了范围
会报错
- 小结
- 都是对日期时间的修改
- plus、minus系列是在原来日期时间上进行的加减
- with系列是直接修改指定值
- 三系方法都不会修改原来的对象,而是将修改后的结果通过新的对象返回
- 扩展:比较时间大小
public boolean isAfter(另一个时间日期对象)
public boolean isBefore(另一个时间日期对象)
public boolean isEqual(另一个时间日期对象)
14-JDK8时间类-时间间隔对象
1 Period
作用:获取两个时间日期类相差具体的值 年月日
- 获取Period对象
public static Period between(LocalDate startDateInclusive, LocalDate endDateExclusive)
参数:两个LocalDate对象
注意:第一个参数小(时间早),第二个参数大(时间晚) -> 比较的结果是正数
第一个参数大(时间晚),第二个参数小(时间早) -> 比较的结果是负数
第一个参数和第二个参数相同 -> 比较的结果是0
返回值:Period对象
- Period成员方法
public int getYears() 获得这段时间的年数
public int getMonths() 获得此期间的月数
public int getDays() 获得此期间的天数
public long toTotalMonths() 获取此期间的总月数
注意:
获得指定差值:年、月、日(不求和)
获得相差总月数:(求和)
2 Duration
- 获取Duration对象
- 定义
public static Duration between(Temporal startInclusive, Temporal endExclusive)
- 说明:
参数:(LocalDateTime,LocalTime)都可以
注意:第一个参数小(时间早),第二个参数大(时间晚) -> 比较的结果是正数
第一个参数大(时间晚),第二个参数小(时间早) -> 比较的结果是负数
第一个参数和第二个参数相同 -> 比较的结果是0
返回值:Duration对象
- 注意
between方法的两个时间日期类型必须包含秒,否则会报错
- Duration成员方法
- 获取总的差值(按单位)
- 例如:总的秒数 -> 其他单位都转换成秒 求总和
public long toDays() 获得此时间间隔的总天数
public long toHours() 获得此时间间隔的总小时数
public long toMinutes() 获得此时间间隔的总分钟数
public long toSeconds() 获得此时间间隔的总秒数
public long toMillis() 获得此时间间隔的总毫秒数
public long toNanos() 获得此时间间隔的总纳秒数
- 可以获得指定差值 -> 不求和
这一类API以Part结尾
public long toDaysPart() 获得此时间间隔的总天数
public long toHoursPart() 获得此时间间隔的小时数
public long toMinutesPart() 获得此时间间隔的分钟数
public long toSecondsPart() 获得此时间间隔的秒数
public long toMillisPart() 获得此时间间隔的毫秒数
public long toNanosPart() 获得此时间间隔的纳秒数
- 代码
public class Test7 {
public static void main(String[] args) {
// 两个时间日期类对象
// 注意点:参数需要有秒
// LocalDate localDate1 = LocalDate.of(2020,6,6);
// LocalDate localDate2 = LocalDate.of(2022,12,20);
// 2020-11-11 11:11:11
LocalDateTime localDateTime1 = LocalDateTime.of(2020,11,11,11,11,11);
// 2020-11-11 12:12:11
LocalDateTime localDateTime2 = LocalDateTime.of(2020,11,11,12,12,12);
// 获取Duration对象
Duration duration = Duration.between(localDateTime1, localDateTime2);
// public long toDays() 获得此时间间隔的总天数
//public long toHours() 获得此时间间隔的总小时数
//public long toMinutes() 获得此时间间隔的总分钟数
//public long toSeconds() 获得此时间间隔的总秒数
//public long toMillis() 获得此时间间隔的总毫秒数
//public long toNanos() 获得此时间间隔的总纳秒数
System.out.println(duration.toMinutes());
//public long toDaysPart() 获得此时间间隔的天数
//public long toHoursPart() 获得此时间间隔的小时数
//public long toMinutesPart() 获得此时间间隔的分钟数
//public long toSecondsPart() 获得此时间间隔的秒数
//public long toMillisPart() 获得此时间间隔的毫秒数
//public long toNanosPart() 获得此时间间隔的纳秒数
System.out.println(duration.toMinutesPart());
}
}
- 练习
jdk8 日期类API
需求
1.房租一个月1000元
2.按季度缴费(3个月)
3.实现:控制台输入信息选择(1.查看当前是否欠租,2.查看什么时候到期,3.缴费,4.退出)
思路:
1.初始化最近一次缴费的日期(yyyy-MM-dd)
2.定义按季度缴费
3.当用户输入1时,控制台打印是否欠租
4.当用户输入2时,控制台打印到期的日期(yyyy-MM-dd)
5.当用户输入3时,控制台提示请输入金额
交3000
6.用户输入1和2验证是否正确
- 扩展:工具类【理解】
// 一般的特点
1.final 不能被继承
2.构造方法私有化
3.变量、方法都是静态的
- 代码
public final class DateUtil {
private DateUtil() {
}
public static final String FORMAT = "yyyy-MM-dd";
public static final String TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
public static final String FORMAT_CN = "yyyy年MM月dd日";
public static final String TIME_FORMAT_CN = "yyyy年MM月dd日 HH时mm分ss秒";
// 比较date1 和 date2大小
// date1 > date2 返回正数
// date1 < date2 返回负数
// date1 = date2 返回0
public static long diff(Date date1,Date date2){
long date1Time1 = date1.getTime();
long date1Time2 = date2.getTime();
return date1Time1 - date1Time2;
}
}