在java中,万物皆对象。时间也是一个对象。下面我们来学习一下相关的API
JDK1.8之前的日期时间API,如下所示
Date类
概述:java.util.Date类 表示一个日期和时间,内部精确到毫秒。
Date类中的构造方法
继续查阅Date类的描述,发现Date拥有多个构造函数,只是部分已经过时,我们重点看以下两个构造函数
- public Date( ):从运行程序的此时此刻到时间原点经历的毫秒值,转换成Date对象,分配Date对象并初始化此对象,以表示分配它的时间(精确到毫秒)。
- public Date(long date):将指定参数的毫秒值date,转换成Date对象,分配Date对象并初始化此对象,以表示自从标准基准时间(称为“历元(epoch)”,即1970年1月1日00:00:00 GMT)以来的指定毫秒数。
tips: 由于中国处于东八区(GMT+08:00)是比世界协调时间/格林尼治时间(GMT)快8小时的时区,当格林尼治标准时间为0:00时,东八区的标准时间为08:00。
简单来说:使用无参构造,可以创建当前系统时间对应的日期对象;指定long类型的构造参数,创建以标准基准时间为基准 指定偏移毫秒数 对应时间的日期对象。代码示例
import java.util.Date;
public class Test {
public static void main(String[] args) {
// 创建当前统时间对应的日期对象
Date date1 = new Date();
System.out.println(date1);// Wed Mar 23 14:38:54 CST 2022
// 创建以标准基准时间为基准 指定偏移1000毫秒
Date date2 = new Date(1000);
System.out.println(date2);// Thu Jan 01 08:00:01 CST 1970
// 创建日期对象,表示1970年1月1日07:59:59
Date date3 = new Date(-1000);
System.out.println(date3);// Thu Jan 01 07:59:59 CST 1970
}
Date类中的多数方法已经过时,常用的方法有:
- public long getTime() :获取当前日期对象距离标准基准时间的毫秒值。
- public void setTime(long time) :设置当前日期对象距离标准基准时间的毫秒值.也就意味着改变了当前日期对象
// 创建当前统时间对应的日期对象
Date date = new Date();
System.out.println(date);// Wed Mar 23 14:38:54 CST 2022
//getTime() :获取当前日期对象距离标准基准时间的毫秒值。
long time = date.getTime();
System.out.println("从标准时间到现在过了:" + time+" 毫秒");// 从标准时间到现在过了:1648018667622 毫秒
//setTime(long time) :设置当前日期对象距离标准基准时间的毫秒值.也就意味着改变了当前日期对象
date.setTime(1000);
System.out.println(date); //Thu Jan 01 08:00:01 CST 1970
- public boolean after(Date when) : 测试此日期对象是否在参数日期对象之后。
- public boolean before(Date when) :测试此日期对象是否在参数日期对象之前。
// 创建当前统时间对应的日期对象
Date date1 = new Date();
// 创建以标准基准时间为基准 指定偏移1000毫秒
Date date2 = new Date(1000L);
System.out.println("date2表示的日期是否在date1之前:"+date2.before(date1));// true
System.out.println("date2表示的日期是否在date1之后:"+date2.after(date1));// false
DateFormat类
概述:
java.text.DateFormat 是日期/时间格式化子类的抽象类,我们通过这个类可以帮我们完成日期和文本之间的转换,也就是可以在Date对象与String对象之间进行来回转换。
- 格式化:按照指定的格式,把Date对象转换为String对象。
- 解析:按照指定的格式,把String对象转换为Date对象。
由于DateFormat为抽象类,不能直接使用,所以需要常用的子类java.text.SimpleDateFormat。这个类需要一个模式(格式)来指定格式化或解析的标准。
构造方法为:
-
public SimpleDateFormat(String pattern):用给定的模式和默认语言环境的日期格式符号构造SimpleDateFormat。参数pattern是一个字符串,代表日期时间的自定义格式。
常用的格式规则为:
常见的日期格式:
- yyyy年MM月dd日 HH时mm分ss秒
- yyyy-MM-dd HH:mm:ss
- yyyy-MM-dd
- HH:mm:ss
DateFormat类的常用方法有:
- public String format(Date date):将Date对象格式化为字符串。
- public Date parse(String source):将字符串解析为Date对象。
-
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class Test { public static void main(String[] args) throws ParseException { // 创建日期格式化对象,并且指定日期格式 SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒"); //创建data对象 Date date = new Date(); // 格式化: 使用日期格式化对象,把日期对象转换为String对象 String format = sdf.format(date); System.out.println(format);//2022年03月23日 16时08分31秒 // 创建字符串对象 String str = "2020年02月09日 02时00分00秒"; // .解析:把String类型的对象转换为Date类型 Date parse = sdf.parse(str); System.out.println(parse);//Sun Feb 09 02:00:00 CST 2020 } }
Calendar类
java.util.Calendar类表示一个“日历类”,可以进行日期运算。它是一个抽象类,不能创建对象,我们可以使用它的子类:java.util.GregorianCalendar类。
有两种方式可以获取GregorianCalendar对象:
- 直接创建GregorianCalendar对象;
- 通过Calendar的静态方法getInstance()方法获取GregorianCalendar对象
代码示例
import java.util.Calendar;
import java.util.GregorianCalendar;
public class Test {
public static void main(String[] args) {
//直接创建GregorianCalendar对象;
GregorianCalendar calendar = new GregorianCalendar();
// 通过Calendar的静态方法getInstance()方法获取GregorianCalendar对象
Calendar cal = Calendar.getInstance();
}
}
Calendar类的常用方法
- public int get(int field) :获取某个字段的值。 参数field:表示获取哪个字段的值,可以使用Calender中定义的常量来表示
- public void set(int field,int value):设置某个字段的值
- public void add(int field,int amount):为某个字段增加/减少指定的值
import java.util.Calendar;
public class Test {
public static void main(String[] args) {
// 通过Calendar的静态方法getInstance()方法获取GregorianCalendar对象
Calendar cal = Calendar.getInstance();
/*
get(int field) :获取某个字段的值。
参数field:表示获取哪个字段的值,可以使用Calender中定义的常量来表示
Calendar.YEAR : 年
Calendar.MONTH :月
Calendar.DAY_OF_MONTH:月中的日期
Calendar.HOUR:小时
Calendar.MINUTE:分钟
Calendar.SECOND:秒
Calendar.DAY_OF_WEEK:星期
*/
//获取当前日历对象的年份
System.out.println(cal.get(Calendar.YEAR)); // 2022
//set(int field,int value):设置某个字段的值
//设置年份为2088年
cal.set(Calendar.YEAR, 2088);
System.out.println(cal.get(Calendar.YEAR)); // 2088
// add(int field,int amount):为某个字段增加/减少指定的值
// 给年份增加2年
cal.add(Calendar.YEAR, 2);
System.out.println(cal.get(Calendar.YEAR)); // 2090
}
}
- public void setTime(Date date) : 使用给定的 Date 设置此 Calendar 的时间。
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
// 需求: 获取1998年10月10日对应的日历对象
public class Demo {
public static void main(String[] args) throws ParseException {
// 创建当前时间的日历对象
Calendar cal1 = Calendar.getInstance();
String birthdayStr = "1998年10月10日";
// 把字符串的日期转换为Date类型的日期
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
Date birthdayDate = sdf.parse(birthdayStr);
// 调用cal的setTime方法,把日期对象传入
cal1.setTime(birthdayDate);
System.out.println(cal1.get(Calendar.YEAR));// 1998
System.out.println((cal1.get(Calendar.MONTH)+1));// 10
System.out.println(cal1.get(Calendar.DAY_OF_MONTH));// 10
}
}
- boolean before(Object when) :判断当前日历对象的时间是否在指定日历对象时间之前
- boolean after(Object when): 判断当前日历对象的时间是否在指定日历对象时间之后
import java.text.ParseException;
import java.util.Calendar;
import java.util.Date;
public class Demo {
public static void main(String[] args) throws ParseException {
// 创建当前时间的日历对象
Calendar c1 = Calendar.getInstance();
Date date = new Date(0L);
// 创建当前时间的日历对象
Calendar c2 = Calendar.getInstance();
//设置成为时间原点的日历对象
c2.setTime(date);
//判断c1日历对象的时间是否在c2日历对象时间之前
System.out.println(c1.before(c2));// false
//判断c1日历对象的时间是否在c2日历对象时间之后
System.out.println(c1.after(c2)); //true
}
}
JDK1.8之后的时间类
Java1.0中包含了一个Date类,但是它的大多数方法已经在Java 1.1引入Calendar类之后被弃用了。而Calendar并不比Date好多少。它们面临的问题是:
- 可变性:象日期和时间这样的类对象应该是不可变的。Calendar类中可以使用三种方法更改日历字段:set()、add() 和 roll()。
- 偏移性:Date中的年份是从1900开始的,而月份都是从0开始的。
- 格式化:格式化只对Date有用,Calendar则不行。
- 此外,它们也不是线程安全的,不能处理闰秒等。
可以说,对日期和时间的操作一直是Java程序员最痛苦的地方之一。第三次引入的API是成功的,并且java 8中引入的java.time API 已经纠正了过去的缺陷,将来很长一段时间内它都会为我们服务。
未完待续