本文主要讲解在JDK1.8以前,Java对于日期时间的相关API。尽管现在已经有了新的API(java.time包),但对于java.util包中的日期时间API依然应用广泛,仍然具有学习的意义。此外,只有了解了util包中的API工作方式、缺陷之处,对于学习java.time包中的日期时间具有指导、借鉴意义。
本文的主要内容:
- 日期时间Date类
- 数据格式化SimpleDateFormat类
- 日历Calendar类
目录
Date类
所在的包:java.util.Date
核心原理:通过查看源码,发现其构造方法是调用System.currentTimeMillis()方法获得long类型整数日期(距离格林尼治时间——1970年1月1日0点的毫秒数,这个时间是为了纪念UNIX诞生);
构造方法(现在没有过时的就只有两个):
- Date() :创建的是一个表示当前系统时间的Date对象
- Date(long date) :根据"指定时间"创建Date对象
常用方法(目前未过时):Date类因为2000年出现的千年虫问题,导致该类很多方法过时,无法使用;
- getTime(); 返回 1970年1月1日00:00到当前系统时间经历的毫秒数
- setTime(); 设置 1970年1月1日00:00到time 的时间点
第一个Date实例
import java.util.Date;
public class TestDate {
public static void main(String[] args) {
Date date = new Date();
System.out.println(date); //输出:Mon Aug 31 10:31:05 CST 2020
System.out.println(date.getTime()); //输出:1598841065038
}
}
SimpleDateFormat类
背景:
- 由于Date创建的日期对象显示的结果不符合中国的习俗,有些人看不懂,所以通过日期的格式化方法将其改为中国的时间显示方式;
- 同时也为了替代Date类中的已经过时了的方法;
层级关系:
java.lang.Object
java.text.Format implements Serializable, Cloneable
java.text.DateFormat
java.text.SimpleDateFormat
SimpleDateFormat的两个重要功能:
- 格式转换(format):将日期转换为指定的格式(将Date对象转换为你想要的的显示方式)
- public String format(Date date)
- public String format(Object time)
- 时间解析(parse):将表示时间的字符串转为Date对象
- public Date parse(String date) throws ParseException
理解格式转换和时间解析:
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class TestDate {
public static void main(String[] args) {
Date date = new Date();
System.out.println("时间格式转换前:" + date); //Mon Aug 31 10:31:05 CST 2020
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
System.out.println("时间格式转换后:" +sdf.format(date));
/* 上述代码输出;
时间格式转换前:Mon Aug 31 13:36:06 CST 2020
时间格式转换后:2020年08月31日 13:36:06
*/
String time = "2058年08月31日 13:36:06";
try {
System.out.println("SimpleDateFormat解析:" + sdf.parse(time));
} catch (ParseException e) {
e.printStackTrace();
}
//上述代码输出:SimpleDateFormat解析:Sat Aug 31 13:36:06 CST 2058
}
}
实例:
问题:请问 “2019-11-04 09:30:30” 往后 1天15小时,30分29s后的时间是多少?
算法:
- 将该字符串时间使用SimpleDateFormat进行parse为Date对象。
- 在Date对象上进行时间的加法。
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Main {
public static void main(String[] args) {
String date = "2019-11-04 09:30:30";
System.out.println(timeCalculation(date));
System.out.println(timeCalculation(""));
System.out.println(timeCalculation("2020 11 1 09:20:33"));
}
/**
* 功能:请问 “2019-11-04 09:30:30” 往后 1天15小时,30分29s后的时间是多少?
* 输入:时间串
* 输出:计算后的时间串
* 算法:
* 1.将该字符串时间使用SimpleDateFormat进行parse为Date对象。
* 2.在Date对象上进行时间的加法。
*/
public static String timeCalculation(String dateTime) {
//注意:参数必须与被解析的时间的格式完全一致,否则抛出ParseException
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date parseDate = new Date();
String result = "";
try {
parseDate = simpleDateFormat.parse(dateTime);
long newDate = parseDate.getTime() + (24L *60*60 + 15*60*60 + 30*60 + 29) * 1000; //小心溢出,使用L
result = simpleDateFormat.format(newDate);
} catch (ParseException e) {
//e.printStackTrace();
result = "解析异常,请检查入参格式";
}
return result;
}
}
Calendar类
特性:
- 所在包java.util.Calendar
- 该类的存在就是为了操作时间;
- Calendar类是一个抽象类,没有自身的实现类,但是可以通过自身提供的getInstance获取一个实例;
第一个Calendar实例
import java.util.Calendar;
import java.util.Date;
public class Main {
public static void main(String[] args) {
//实例
Calendar rightNow = Calendar.getInstance();
//获取
int year = rightNow.get(Calendar.YEAR);
int days = rightNow.get(Calendar.DAY_OF_YEAR);
Date date = rightNow.getTime(); //获取日期对象
long time = rightNow.getTimeInMillis(); //此刻时间毫秒值
//修改
rightNow.set(Calendar.YEAR, 2022);
//运算
rightNow.add(Calendar.DAY_OF_YEAR , 701); //时间的加法操作
rightNow.add(Calendar.HOUR , -15); //时间的减法操作
}
}
总结:
- 日期时间Date类:获取当前时间距离1970年1月1日0点的毫秒数
- 数据格式化SimpleDateFormat类:将时间格式转换成自己想要的格式
- 日历Calendar类:对时间进行操作(加减等运算)