一、包的位置
- java.util.Date;
- java.text.DateFormat;
- java.lang.Calendar;
二、整体概括三者的介绍
java.util.Date
- 表示的是特定的时刻,精度为毫秒
- 不适合国际化处理;
java.text.DateFormat
- 日期格式化类;
- 能够格式化Date对象为特定格式的字符串;
- 也能将特定格式的字符串转化为Date对象;
java.lang.Calendar
- 日历类
- 出现在Date类后面,主要是为了解决Date类不能国际化的问题
三、Date
1、构造方法
- 下面只记录用得上的构造方法
- Date()
- Date(long date)
- 计算1970年1月1日00:00:00GMT到date代表时刻的毫秒数
- GMT指的是格林威治时间,中国在东八区,需要加上八个小时
- 用人话说就是,该构造器计算的是从1970年1月1日早上八点整到传入的date代表的时间,这期间总共的毫秒数
- 以下简称格林时间(1970年1月1日08:00:00)
- date可以比当前时间早,也可以比当前时间晚,自定义即可
2、常用API
- long getTime()
- void setTime(long time)
- 设置此date对象为格林时间后time毫秒的时间点
public class demo {
public static void main(String[] args) {
//创建一个当前时间的Date
Date date = new Date();
//日期减一天(24小时*60分钟*60秒*1000毫秒)
long time = date.getTime()-(24*60*60*1000);
Date date2 = new Date(time);
System.out.println(date);
System.out.println(date2); //会发现日期早了一天
}
}
Tue Nov 02 20:36:18 CST 2021
Mon Nov 01 20:36:18 CST 2021
四、DateFormat类
1、概述
- 日期格式化类,注意这是一个抽象类
- 要使用此类,需要通过子类SimpleDateFormat
- 下面主要介绍子类SimpleDateFormat的用法
2、SimpleDateFormat的构造方法
- SimpleDateFormat("日期格式字符串")
- 日期格式字符串中一些字母的含义(常用)
- y代表年,M代表月,d代表日
- H代表时,m代表分,s代表秒
3、常用API
- 首先创建一个SimpleDateFormat的对象,定义为format
- format.format(Date date)
- 将传入的date对象格式化成指定格式的时间字符串
- 返回值是Sring
- format.parse(String time)
- 将传入的字符串转换为Date对象
- 传入的String必须与定义SimpleDateFormat对象时的日期格式一致
- 返回值是Date
4、应用场景及举例
- 可以用SimpleDateFormat和Date的一些API计算某个人出生到现在总共活了多少天
package SimpleDateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class demo {
public static void main(String[] args) throws ParseException {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//parse:将yyyy-MM-dd HH:mm:ss类型的字符串转化成Date对象
Date birthday = format.parse("2000-12-09 00:00:00");
//计算出生的天数
System.out.println((new Date().getTime()-birthday.getTime())/1000/60/60/24);
}
}
五、Calendar类
1、概述
- Calendar是日历类,出现在Date类后面,解决了Date类不能国际化的问题
- getInstance方法的源码,会根据默认的时区去创建相应的日历类(了解一下就行)
- Calendar类是一个抽象类,不能通过new创建对象,但是可以通过getInstance方法获取Calendar对象
- 日期信息存储在数组中,年、月、日等信息封装成了不同的常量,通过这些常量能够访问数组对应的下标,对应下标存储的就是对应的日期信息
- 注意
- 计算机中日历的月份是0-11,对应现实生活月份的1-12
- 星期日是一个星期的第一天
2、常用API
static Calendar getInstance()
int get (int field)
- 返回指定的日历字段
- 传入的field就是Calendar类中定义的常量,或者常量对应的数字
- 通过传入的参数可以访问对应的下标志,获取对应的日期信息
- 比如访问年(YEAR)、月(MONTH)、日(DAY)、一年中的第几天(DAY_OF_YEAR)等
void set (int field, int amount)
- 将给定的日历字段设置为指定的值
- 第一个参数可以传入Calendar类的常量或相应的数字,表示日期的某个字段
- amount表示要给该日期字段设置的值
- 注意月份是0-11,想要设置的月份-1,才是真正设置的值
abstract void add (int field, int amount)
- 根据日历的规则,对指定的日历字段进行添加或删减操作
- 第一个参数指的是日期的哪个字段
- 第二个数字是要给该字段添加或删减的值
- 比如给Calendar.YEAR添加或删减2年
- 第一个参数就为Calendar.YEAR
- 第二个参数是2或-2
Date getTime()
- 返回一个Date对象,表示此Calendar的时间值
int getAutcualMaximum(int field)
- 给定日期的字段,计算该字段的最大值
- 比如要求某个月的最大天数,传入的参数应该为Calendar.DAY_OF_MONTH
- 在此之前可以根据需求使用set方法设置月份,注意设置的是真实月份-1
- 假设月份代表的是一月,则调用该方法得出的结果是31,即一月份最多有31天(最大值)
3、举例
package Calendar;
import java.util.Calendar;
import java.util.Date;
public class demo {
public static void main(String[] args) {
//创建日期类对象
Calendar calendar = Calendar.getInstance();
//get方法:根据不同的常量获取日期数组下标的值
int year = calendar.get(Calendar.YEAR); //获取年份
int month = calendar.get(Calendar.MONTH); //获取月份,月份是0-11,值是当前月份-1
int day_of_year = calendar.get(Calendar.DAY_OF_YEAR); //当天是一年中的第几天
System.out.println(day_of_year); //307
System.out.println(year+"-"+month); //2021-10
//set方法:设置数组下标值代表的日期的值
calendar.set(Calendar.YEAR,2022); //设置年份为2022年
System.out.println(calendar.get(Calendar.YEAR)); //2022
//add方法:日期加减方法
calendar.add(Calendar.YEAR,5); //年份+5年
System.out.println(calendar.get(Calendar.YEAR)); //2022+5=2027
calendar.add(Calendar.DATE,-1); //年月日的日-1天,原来是3
System.out.println(calendar.get(Calendar.DAY_OF_MONTH)); // 3-1=2
//getTime:获取日历时间,返回一个Date对象
Date time = calendar.getTime();
System.out.println(time);
//getActualMaximum:获取指定日期的最大值
calendar.set(Calendar.MONTH,0); //设置月份为1月
int max1 = calendar.getActualMaximum(Calendar.DAY_OF_MONTH); //一月份的最大天数:31
int max2 = calendar.getActualMaximum(Calendar.DAY_OF_WEEK); // 一星期最大的天数:7
System.out.println(max1);
System.out.println(max2);
}
}