前言
- 本篇主要说 java.util 包下的类
- (主要介绍Arrays类、日期时间)
- 注意:在java.util.包下,可以直接 类名. 调用,无需创建对象
一、Arrays类
- 内部都是静态方法
- Arrays的常用方法:
二、工具类
- 工具类设计思想
- 构造方法用 private 修饰
- 成员用 public static 修饰
三、日期时间
3.1 Data类
3.1.1 Data类概念
-
时间
世界标准时间 (格林威治时间Greenwich Mean Time) 简称GMT
中国(东八区)标准时间: 世界标准时间+8小时
-
计算机中的时间原点
1970年1月1日 00:00:00
-
时间换算单位
1秒 = 1000毫秒
-
Date类概述
Date 代表了一个特定的时间,精确到毫秒
-
Date类 (java.uill.包下的Data) 构造方法
方法名 说明 public Date() 分配一个 Date对象,并初始化,以便它代表它被分配的时间,精确到毫秒 public Date(long date) 分配一个 Date对象,并将其初始化为表示从标准基准时间起指定的毫秒数 -
示例代码
public class DateDemo01 { public static void main(String[] args) { //public Date():分配一个 Date对象,并初始化,以便它代表它被分配的时间,精确到毫秒 Date d1 = new Date(); System.out.println(d1); //public Date(long date):分配一个 Date对象,并将其初始化为表示从标准基准时间起指定的毫秒数 long date = 1000*60*60; Date d2 = new Date(date); System.out.println(d2); } }
-
方法一:public Date()
-
方法二:public Date(long date)
3.1.2 Date类常用方法
-
内部的方法大部分为非静态,需要创建Date的对象来调用
-
常用方法
方法名 说明 public long getTime() 获取的是日期对象从1970年1月1日 00:00:00到现在的毫秒值 public void setTime(long time) 设置时间(重设当前的时间)
给的是毫秒值- public long getTime();与System类(笔记day13)中的方法——>System.currentTimeMillis(); 的打印结果一样
- public long getTime();与System类(笔记day13)中的方法——>System.currentTimeMillis(); 的打印结果一样
-
示例代码
public class DateDemo02 { public static void main(String[] args) { //创建日期对象 Date d = new Date(); //public long getTime():获取的是日期对象从1970年1月1日 00:00:00到现在的毫秒值 // System.out.println(d.getTime()); // System.out.println(d.getTime() * 1.0 / 1000 / 60 / 60 / 24 / 365 + "年"); //public void setTime(long time):设置时间,给的是毫秒值 // long time = 1000*60*60; long time = System.currentTimeMillis(); d.setTime(time); System.out.println(d); } }
3.2 Data类日期解析与格式化
3.2.1 SimpleDateFormat类
-
SimpleDateFormat类概述
SimpleDateFormat是一个具体的类,用于以区域设置敏感的方式格式化和解析日期。
-
我们重点学习日期格式化和解析
- 格式化 (创建的)时间对象------->时间字符串
- 解析 时间字符串------->时间对象
-
日期和时间模式:
-
SimpleDateFormat类构造方法
方法名 说明 public SimpleDateFormat() 构造一个SimpleDateFormat
使用默认模式和日期格式public SimpleDateFormat(String pattern) 构造一个SimpleDateFormat使用给定的模式和默认的日期格式 -
SimpleDateFormat类的常用方法
- 格式化(从Date到String)
- 用 .format(Date date) 方法
- public final String format(Date date):将日期格式化成日期/时间字符串
- public final String format(Date date):将日期格式化成日期/时间字符串
-
解析(从String到Date)
-
用 .parse(String source)方法
- public Date parse(String source):从给定字符串的开始解析文本以生成日期
- public Date parse(String source):从给定字符串的开始解析文本以生成日期
-
解析为时间的对象,还原为没有使用构造方法的初始
-
使用SimpleDateFormat类中parse方法的注意事项:
-
1、自定义的格式要与字符串的相同才能进行解析,且必须自定义格式,不能使用默认格式了,不然会出现ParseException异常
-
2、SimpleDateFormat类中parse方法是一个非静态的方法,非静态方法是需要用对象来调用的
-
3、问题:格式不一致导致无法解析
-
解决:
-
重新定义一个规定格式的字符串
3.3 时间日期类练习
-
需求
秒杀开始时间是2020年11月11日 00:00:00
结束时间是2020年11月11日 00:10:00
用户小贾下单时间是2020年11月11日 00:03:47
用户小皮下单时间是2020年11月11日 00:10:11
判断用户有没有成功参与秒杀活动
-
实现步骤
- 判断下单时间是否在开始到结束的范围内
- 把字符串形式的时间变成毫秒值
-
代码实现
public class DateDemo5 { public static void main(String[] args) throws ParseException { //开始时间:2020年11月11日 0:0:0 //结束时间:2020年11月11日 0:10:0 //小贾2020年11月11日 0:03:47 //小皮2020年11月11日 0:10:11 //1.判断两位同学的下单时间是否在范围之内就可以了。 //2.要把每一个时间都换算成毫秒值。 String start = "2020年11月11日 0:0:0"; String end = "2020年11月11日 0:10:0"; String jia = "2020年11月11日 0:03:47"; String pi = "2020年11月11日 0:10:11"; SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss"); long startTime = sdf.parse(start).getTime(); long endTime = sdf.parse(end).getTime(); // System.out.println(startTime); // System.out.println(endTime); long jiaTime = sdf.parse(jia).getTime(); long piTime = sdf.parse(pi).getTime(); if(jiaTime >= startTime && jiaTime <= endTime){ System.out.println("小贾同学参加上了秒杀活动"); }else{ System.out.println("小贾同学没有参加上秒杀活动"); } System.out.println("------------------------"); if(piTime >= startTime && piTime <= endTime){ System.out.println("小皮同学参加上了秒杀活动"); }else{ System.out.println("小皮同学没有参加上秒杀活动"); } } }
3.4 JDK8新增日期类
由于一些问题用旧的Date类去解决会比较繁琐,因此扩展出JDK8时间日期类去解决一些问题
- 示例对比
- 需求:定义时间字符串”2025年11月11日 00:00:00 “ 将这个时间+1天,再按照原来格式输出
- 主函数使用新旧两个方法做对比
- 使用Data类进行解题
- 使用新增JDK8新增日期类进行解题
3.4.1 JDK8新增日期类基本
- LocalDate 表示日期(年月日)
- LocalTime 表示时间(时分秒)
- LocalDateTime 表示时间+ 日期 (年月日时分秒)
3.4.2 LocalDateTime创建方法
-
没有构造方法,但是可以根据以下两个方法进行调用
-
静态方法—— 类名. 调用
-
方法说明:
方法名 说明 public static LocalDateTime now() 获取当前系统时间 public static LocalDateTime of (年, 月 , 日, 时, 分, 秒) 使用指定年月日和时分秒初始化一个LocalDateTime对象 -
示例代码:
public class JDK8DateDemo2 { public static void main(String[] args) { LocalDateTime now = LocalDateTime.now(); System.out.println(now); LocalDateTime localDateTime = LocalDateTime.of(2020, 11, 11, 11, 11, 11); System.out.println(localDateTime); } }
3.4.3 LocalDateTime获取方法
- 方法说明:
方法名 | 说明 |
---|---|
public int getYear() | 获取年 |
public int getMonthValue() | 获取月份(1-12) |
public int getDayOfMonth() | 获取月份中的第几天(1-31) |
public int getDayOfYear() | 获取一年中的第几天(1-366) |
public DayOfWeek getDayOfWeek() | 获取星期(是这周的第几天) |
public int getMinute() | 获取分钟 |
public int getHour() | 获取小时 |
public int getSecond() | 获取秒数 |
- 示例代码
public class JDK8DateDemo3 {
public static void main(String[] args) {
LocalDateTime localDateTime = LocalDateTime.of(2020, 11, 11, 11, 11, 20);
//public int getYear() 获取年
int year = localDateTime.getYear();
System.out.println("年为" +year);
//public int getMonthValue() 获取月份(1-12)
int month = localDateTime.getMonthValue();
System.out.println("月份为" + month);
Month month1 = localDateTime.getMonth();
// System.out.println(month1);
//public int getDayOfMonth() 获取月份中的第几天(1-31)
int day = localDateTime.getDayOfMonth();
System.out.println("日期为" + day);
//public int getDayOfYear() 获取一年中的第几天(1-366)
int dayOfYear = localDateTime.getDayOfYear();
System.out.println("这是一年中的第" + dayOfYear + "天");
//public DayOfWeek getDayOfWeek()获取星期
DayOfWeek dayOfWeek = localDateTime.getDayOfWeek();
System.out.println("星期为" + dayOfWeek);
//public int getMinute() 获取分钟
int minute = localDateTime.getMinute();
System.out.println("分钟为" + minute);
//public int getHour() 获取小时
int hour = localDateTime.getHour();
System.out.println("小时为" + hour);
}
}
3.4.4 LocalDateTime转换方法
- 方法说明:
方法名 | 说明 |
---|---|
public LocalDate toLocalDate () | 转换成为一个LocalDate对象 |
public LocalTime toLocalTime () | 转换成为一个LocalTime对象 |
3.4.5 LocalDateTime格式化和解析
-
新旧Date对比图解:
-
方法说明:
方法名 | 说明 |
---|---|
public String format (指定格式) | 把一个LocalDateTime格式化成为一个字符串 |
public LocalDateTime parse (准备解析的字符串, 解析格式) | 把一个日期字符串解析成为一个LocalDateTime对象 |
public static DateTimeFormatter ·ofPattern(String pattern) | 使用指定的日期模板获取一个日期格式化器DateTimeFormatter对象 |
-
示例:
-
格式化日期时间 (时间日期——>String)
-
解析日期时间 (String——>时间日期)
- 使用DateTimeFormatter类中的 .parse方法时,是用 日期类名. 调用
- 使用DateTimeFormatter类中的 .parse方法时,是用 日期类名. 调用
-
3.4.6 LocalDateTime增加、减少时间的方法
- [一 ]方法 01:增加或减少时间
方法说明:
方法名 | 说明 |
---|---|
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) | 添加或者减去周 |
/* JDK8 时间类添加或者减去时间的方法如下: */
public class JDK8DateDemo6 {
public static void main(String[] args) {
//public LocalDateTime plusYears (long years) 添加或者减去年
LocalDateTime localDateTime = LocalDateTime.of(2020, 11, 11, 13, 14, 15);
//LocalDateTime newLocalDateTime = localDateTime.plusYears(1);
//System.out.println(newLocalDateTime);
LocalDateTime newLocalDateTime = localDateTime.plusYears(-1);
System.out.println(newLocalDateTime);
}
}
- [一 ]方法 02:减少或者添加时间
- 与上面的plusXXX()方法的区别:
-
方法说明(单位相反):
方法名 说明 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) 减去或者添加周 -
示例代码:
JDK8 时间类减少或者添加时间的方法如下:
public class JDK8DateDemo7 {
public static void main(String[] args) {
//public LocalDateTime minusYears (long years) 减去或者添加年
LocalDateTime localDateTime = LocalDateTime.of(2020, 11, 11, 13, 14, 15);
//LocalDateTime newLocalDateTime = localDateTime.minusYears(1);
//System.out.println(newLocalDateTime);
LocalDateTime newLocalDateTime = localDateTime.minusYears(-1);
System.out.println(newLocalDateTime);
}
}
3.4.7 LocalDateTime修改方法
-
方法说明
方法名 说明 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) 直接修改秒 -
示例代码
/** * JDK8 时间类修改时间 */ public class JDK8DateDemo8 { public static void main(String[] args) { //public LocalDateTime withYear(int year) 修改年 LocalDateTime localDateTime = LocalDateTime.of(2020, 11, 11, 13, 14, 15); // LocalDateTime newLocalDateTime = localDateTime.withYear(2048); // System.out.println(newLocalDateTime); LocalDateTime newLocalDateTime = localDateTime.withMonth(20); System.out.println(newLocalDateTime); } }
四、关于时间间隔的计算
4.1 Period类 ——计算年月日时间间隔
- 方法说明:
方法名 | 说明 |
---|---|
public static Period between(开始时间,结束时间) | 计算两个“时间"的间隔 |
public int getYears() | 获得这段时间的年数 |
public int getMonths() | 获得此期间的总月数 |
public int getDays() | 获得此期间的天数 |
public long toTotalMonths() | 获取此间隔期间的总月数 |
- 注意事项:
- 只能计算年月日之间的间隔,不能计算时分秒之间的间隔
- 且必须为LocalDate类的对象
- 如图:
4.2 Duration类——计算时分秒时间间隔
-
无构造方法,使用static方法Durationbetween
-
方法说明:
方法名 | 说明 |
---|---|
public static Durationbetween(开始时间,结束时间) | 计算两个“时间"的间隔 |
public long toSeconds() | 获得此时间间隔的秒 |
public int toMillis() | 获得此时间间隔的毫秒 |
public int toNanos() | 获得此时间间隔的纳秒 |
-
注意事项:
-
public static Durationbetween(开始时间,结束时间)中的参数
- 参数类型是:Temporal
- 该参数类型是一个接口,只能通过实现类去进行传入如下:
- 参数类型是:Temporal
-
Period 和 Duration 的总结:
- 相同点:都是计算两个时间的间隔 beteewn
- 不同点: 精确单位不一样,即应用场景不一样
- Period 精确到年月日
- Duration精确到秒数