- 日期与时间
- Date类
- SimpleDateFormat类
- Calendar类
- JDK8开始新增的日期API
- 包装类
- 正则表达式
- Arrays类
- Lambda表达式
日期与时间 Date类
简介:Date类的对象在Java中代表的是当前所在系统的此刻日期时间;
常用方法:
| 方法名 | 说明 |
|---|---|
| public Date() | 创建一个Date对象,代表的是系统当前此刻的日期时间 |
| public Date(long time) | 把时间毫秒值转化成Date日期对象 |
| public long getTime() | 获取时间对象毫秒值 |
| public void setTime(long Time) | 设置日期对象的时间为当前时间毫秒值对应的时间 |
SimpleDateFormat类
简介:
- 可以对Date对象或时间毫秒值格式化成我们喜欢的时间形式。
- 也可以把字符串的时间形式解析成日期格式;
常用方法:
| 方法名 | 说明 |
|---|---|
| public SimpleDateFormat() | 构造一个SimpleDateFormat,使用默认格式 |
| public SimpleDateFormat(String pattern) | 构造一个SimpleDateFormat,使用指定的格式 |
| public final String format(Date date) | 将日期格式化成日期/时间字符串 |
| public final String format(Object time) | 将时间毫秒值格式化成日期/时间字符串 |
package cn.edu.njust.date;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Test {
public static void main(String[] args) {
// 1.创建日期对象
Date date = new Date();
System.out.println(date);
// 2.格式化这个日期对象(指定最终格式化形式)
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss EEE a");
// 3.开始格式化
String time = sdf.format(date);
System.out.println(time);
// 4.格式化时间毫秒值 | 假设需要当前时间+120秒
long time1 = System.currentTimeMillis() + 120 * 1000;
String time11 = sdf.format(time1);
System.out.println(time11);
}
}
package cn.edu.njust.date;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class SimpleDateFormatDemo {
public static void main(String[] args) throws ParseException {
// 目标:学会使用SimpleDateFormat解析字符串时间成为时间对象
// 2021年08月06日11:11:11 往后的2填14小时49分06秒
// 1.首先将字符串时间存储
String startTime = "2021年08月06日 11:11:11";
// 2.将字符串时间解析
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
Date date = sdf.parse(startTime);
// 3.计算
long endTime = date.getTime() + (2L*24*60*60 + 14*60*60 + 49*60 + 6) * 1000;
// 4.格式化时间
System.out.println(sdf.format(endTime));
}
}
Calendar类
概述:
- Calendar代表了系统此刻日期对应的日历对象;
- Calendar是一个抽象类,不能直接创建对象;
常用方法:
| 方法名 | 说明 |
|---|---|
| public int get(int field) | 取日期中的某个字段信息 |
| public void set(int field,int value) | 修改日历的某个字段信息 |
| public void add(int field,int amount) | 为某个字段增加/减少指定的值 |
| public final Date getTime() | 拿到此刻日期对象 |
| public long getTimeInMillis() | 拿到此刻时间毫秒值 |
JDK8开始新增的日期API
概述:从Java 8 开始,java.time包提供了新的日期和时间API,主要涉及以下:
| 方法名 | 说明 |
|---|---|
| LocalDate | 不包含具体时间的日期 |
| LocalTime | 不包含具体日期的时间 |
| LocalDateTime | 包含了具体日期和时间 |
| Instant | 代表的是时间戳 |
| DateTimeFormatter | 用于做时间的格式化和解析 |
| Duration | 用于计算两个“时间”间隔 |
| Period | 用于计算两个“日期”间隔 |
包装类
概述:其实就是8中基本数据类型对应的引用类型
| 基本数据类型 | 引用数据类型 |
|---|---|
| byte | Byte |
| short | Short |
| int | Integer |
| long | Long |
| char | Character |
| float | Float |
| double | Double |
| boolean | Boolean |
为什么提供包装类:Java为了实现一切皆对象,为8种基本类型提供了对应的引用类型
自动装箱:基本类型的变量可以直接赋值给对应的包装类类型变量;
自动拆箱:包装类类型的变量可以直接赋值给对应的基本类型变量;
包装类的特色功能:
- 包装类的变量的默认值可以是null,容错率高;
- 可以把基本类型的数据转换成字符串类型(用处不大);
- 可以把字符串类型的变量转换成真实数据类型(十分有用)
Integer.parseInt("字符串类型的整数");
Double.parseDouble("字符串类型的小数");
// 另一种方式
int num = Integer.valueOf("123").intValue();
正则表达式
概述:正则表达式可以用一些规定的字符来指定规则,并用来检验数据格式的合法性;
匹配规则:
实用案例 – 信息爬取:
package cn.edu.njust.regex;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexDemo02 {
public static void main(String[] args) {
String s = "来黑马程序学习Java,电话020-43422424,或者联系邮箱" +
"itcast@itcast.cn,电话18762832633,0203232323" +
"邮箱bozai@itcast.cn,400-100-3233 ,4001003232";
// 爬取电话号码和邮箱
// 1.定义爬取规则
String regex = "(\w{1,30}@\w{2,10}(\.\w{2,10}){1,2})|" +
"(1[3-9]\d{9})|(0\d{2,5}-?\d{5,15})|400-?\d{3,8}-?\d{3,8}";
// 2.编译规则成一个匹配对象
Pattern pattern = Pattern.compile(regex);
// 3.得到内容 --> 匹配器对象
Matcher matcher = pattern.matcher(s);
// 4.开始查找
while (matcher.find()){
String str = matcher.group();
System.out.println(str);
}
}
}
Arrays类
概述:数组操作工具类,专门用于操作数组元素的。
常用API:
| 方法名 | 说明 |
|---|---|
| public static String toString(类型[] a) | 对数组进行排序 |
| public static void sort(类型[] a) | 对数组进行默认升序排列 |
| public static void sort(类型[] a, Comparator super T> c) | 使用比较器对象自定义排序 |
| public static int binarySearch(int[], int key) | 二分搜索数组中的数据,存在返回索引,不存在返回【-(应插入位置)-1】 |
自定义排序规则:
- 如果认为左边数据>右边数据 --> 返回正整数;降序
- 如果认为左边数据<右边数据 --> 返回负整数;升序
- 如果相等,返回0;
package cn.edu.njust.arrays;
import java.util.*;
public class Demo01 {
public static void main(String[] args) {
// 自定义排序规则
int[] arr = {3, 5, 1, 2, 7, 9, 6, 8};
// 默认升序
Arrays.sort(arr);
System.out.println(Arrays.toString(arr));
// 降序 -- 需要自定义比较规则,即比较器;特别注意:只能支持引用类型
Integer[] arr1 = {3, 5, 1, 2, 7, 9, 6, 8};
Arrays.sort(arr1, new Comparator() {
@Override
public int compare(Integer integer, Integer t1) {
// 指定比较规则
// return integer - t1; 升序
return t1 - integer; // 降序
}
});
System.out.println(Arrays.toString(arr1));
}
}
Lambda表达式
概述:JDK8以后的新语法格式,用于简化匿名内部类的代码写法;
简化格式:
(匿名内部类被重写方法的形参列表)->{
被重写的方法体;
}
特别注意:Lambda表达式只能简化函数式接口的匿名内部类写法形式;
package cn.edu.njust.lambda;
public class Demo01 {
public static void main(String[] args) {
// 学会使用Lambda表达式简化匿名内部类
Animal a = new Animal(){
@Override
public void cry() {
System.out.println("动物发出叫声!!!");
}
};
a.cry();
// 使用Lambda表达式
}
abstract static class Animal{
public abstract void cry();
}
}
package cn.edu.njust.lambda;
public class Demo02 {
public static void main(String[] args) {
Animal a1 = new Animal() {
@Override
public void eat() {
System.out.println("动物正在进食!");
}
};
have(a1);
System.out.println("----------Lambda表达式----------");
// 使用Lambda表达式
Animal a2 = () -> System.out.println("动物正在进食!");
have(a2);
//进一步,调用方法时:
System.out.println("----------再次简化----------");
have(()->System.out.println("动物正在进食!"));
}
public static void have(Animal animal){
System.out.println("准备觅食");
animal.eat();
System.out.println("用餐完毕");
}
//函数式接口的标志,表明内部只能有一个方法
@FunctionalInterface
interface Animal{
void eat();
}
}
简化总结:
- 参数类型可以省略不写。
- 如果只有一个参数,参数类型可以省略,同时()也可以省略。
- 如果Lambda表达式的方法体代码只有一行代码。可以省略大括号不写,同时要省略分号!
- 如果Lambda表达式的方法体代码只有一行代码。可以省略大括号不写。此时,如果这行代码是return语句,必须省略return不写,同时也必须省略";"不写



