java.util.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 Demo01Date {
public static void main(String[] args) {
// 创建当前系统时间日期对象
Date d1 = new Date();
System.out.println(d1);// Tue Aug 11 10:50:43 CST 2020
// 创建距离标准基准时间1000毫秒对应的时间日期对象
Date d2 = new Date(1000);
System.out.println(d2);// Thu Jan 01 08:00:01 CST 1970
}
}
tips:在使用println方法时,会自动调用Date类中的toString方法。Date类对Object类中的toString方法进行了覆盖重写,所以结果为指定格式的字符串。
Date类中的多数方法已经过时,常用的方法有:
public long getTime()
获取当前日期对象距离标准基准时间的毫秒值。public void setTime(long time)
设置当前日期对象距离标准基准时间的毫秒值.也就意味着改变了当前日期对象示例代码
public class Test {
public static void main(String[] args) {
/*
Date类的概述:java.util.Date类 表示一个日期和时间,内部精确到毫秒。
Date类的构造方法:
public Date():创建当前系统时间日期对象
public Date(long date):创建距离标准基准时间,指定偏移毫秒数 对应的时间日期对象
标准基准时间:1970年01月01日 00:00:00
东八区标准基准时间:1970年01月01日 08:00:00
Date类的成员方法:
- public long getTime() 获取当前日期对象距离标准基准时间的毫秒值。
- public void setTime(long time) 设置当前日期对象距离标准基准时间的毫秒值.也就意味着改变了当前日期对象
- public boolean after(Date when) 测试此日期是否在指定日期之后。
- public boolean before(Date when) 测试此日期是否在指定日期之前。
*/
// 创建当前系统时间日期对象
Date d1 = new Date();
System.out.println(d1);// Tue Aug 11 10:50:43 CST 2020
// 创建距离标准基准时间1000毫秒对应的时间日期对象
Date d2 = new Date(1000);
System.out.println(d2);// Thu Jan 01 08:00:01 CST 1970
System.out.println("=================================");
// 获取d1日期对象距离标准基准时间的毫秒值
System.out.println(d1.getTime());// 1597114635573
// 获取d2日期对象距离标准基准时间的毫秒值
System.out.println(d2.getTime());// 1000
System.out.println("======================================");
// 创建距离标准基准时间1000毫秒对应的时间日期对象
Date d3 = new Date();
d3.setTime(1000);
System.out.println(d3);// Thu Jan 01 08:00:01 CST 1970
System.out.println("======================================");
// 判断d1是否d2日期之后
System.out.println(d1.after(d2));// true
// 判断d1是否d2日期之前
System.out.println(d1.before(d2));// false
}
}
Date类的概述:java.util.Date类 表示一个日期和时间,内部精确到毫秒。
Date类的构造方法:
public Date():创建当前系统时间日期对象
public Date(long date):创建距离标准基准时间,指定偏移毫秒数 对应的时间日期对象
标准基准时间:1970年01月01日 00:00:00
东八区标准基准时间:1970年01月01日 08:00:00
Date类的成员方法:
- public long getTime() 获取当前日期对象距离标准基准时间的毫秒值。
- public void setTime(long time) 设置当前日期对象距离标准基准时间的毫秒值.也就意味着改变了当前日期对象
- public boolean after(Date when) 测试此日期是否在指定日期之后。
- public boolean before(Date when) 测试此日期是否在指定日期之前。
java.text.DateFormat
是日期/时间格式化子类的抽象类,我们通过这个类可以帮我们完成日期和文本之间的转换,也就是可以在Date对象与String对象之间进行来回转换。
由于DateFormat为抽象类,不能直接使用,所以需要常用的子类java.text.SimpleDateFormat
。这个类需要一个模式(格式)来指定格式化或解析的标准。构造方法为:
public SimpleDateFormat(String pattern)
:用给定的模式和默认语言环境的日期格式符号构造SimpleDateFormat。参数pattern是一个字符串,代表日期时间的自定义格式。常用的格式规则为:
标识字母(区分大小写) | 含义 |
---|---|
y | 年 |
M | 月 |
d | 日 |
H | 时 |
m | 分 |
s | 秒 |
备注:更详细的格式规则,可以参考SimpleDateFormat类的API文档。
DateFormat类的常用方法有:
public String format(Date date)
:将Date对象格式化为字符串。
public Date parse(String source)
:将字符串解析为Date对象。
public class SimpleDateFormatDemo {
public static void main(String[] args) throws ParseException {
// 创建日期格式化对象,指定日期格式为:yyyy-MM-dd HH:mm:ss
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// Date--->String
Date d = new Date();
String dateStr = sdf.format(d);
System.out.println("dateStr:"+dateStr);// 2020-08-11 11:18:03
// String--->Date
String birthday = "1998-10-10 11:11:11";
Date birthdayDate = sdf.parse(birthday);
System.out.println("birthdayDate:"+birthdayDate);// Sat Oct 10 11:11:11 CST 1998
System.out.println("==================================");
// 注意事项:
String strDate = "1999年10月10日 11:11:11";
//Date date = sdf.parse(strDate);// 报解析异常ParseException 要解析的日期格式和日期格式化对象中指定的格式不一致
}
}
SimpleDateFormat类: 继承DateFormat类
概述:java.text.SimpleDateFormat 是日期/时间格式化类
作用:可以将字符串类型的日期转换为Date类型的日期 String--->Date
可以将Date类型的日期转换为字符串类型的日期 Date--->String
构造方法:
public SimpleDateFormat(String pattern): 创建日期格式化对象,通过参数指定日期格式
日期格式:
y 年
M 月
d 日
H 时
m 分
s 秒
常用的日期格式: yyyy-MM-dd HH:mm:ss yyyy年MM月dd日 HH:mm:ss
成员方法:
- public String format(Date date):将Date对象格式化为字符串。 格式化
- public Date parse(String source):将字符串解析为Date对象。 解析
注意:要解析的日期格式和日期格式化对象中指定的格式要一致,否则报异常
public class Test {
public static void main(String[] args) throws ParseException {
// 需求: 键盘输入一个字符串类型的时间,打印你来到世界多少天?
// 1.键盘录入一个字符串类型的时间
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个出生日期,格式yyyy-MM-dd: ");
String birthdayStr = sc.next();
// 2.创建日期格式化对象,指定日期格式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
// 3.把字符串类型的时间转换为Date类型的时间
Date birthdayDate = sdf.parse(birthdayStr);
// 4.创建当前系统时间日期对象
Date nowDate = new Date();
// 5.获取当前系统时间日期对象距离标准基准时间的毫秒值
long birthdayTime = birthdayDate.getTime();
// 5.获取出生日期距离标准基准时间的毫秒值
long nowTime = nowDate.getTime();
// 6.计算2个毫秒值差,换算成天,打印输出
System.out.println("来到世界"+((nowTime - birthdayTime) / 1000 / 60 / 60 / 24)+"天");
}
}
java.util.Calendar类表示一个“日历类”,可以进行日期运算。它是一个抽象类,不能创建对象,我们可以使用它的子类:java.util.GregorianCalendar类。
有两种方式可以获取GregorianCalendar对象:
public static Calendar getInstance() 获取当前日期的日历对象
public static void main(String[] args) {
Calendar cal = Calendar.getInstance();
System.out.println(cal);
/*
java.util.GregorianCalendar[time=1597117748394,areFieldsSet=true,areAllFieldsSet=true,
lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,
dstSavings=0,useDaylight=false,transitions=19,lastRule=null],firstDayOfWeek=1,
minimalDaysInFirstWeek=1,ERA=1,YEAR=2020,MONTH=7,WEEK_OF_YEAR=33,WEEK_OF_MONTH=3,
DAY_OF_MONTH=11,DAY_OF_YEAR=224,DAY_OF_WEEK=3,DAY_OF_WEEK_IN_MONTH=2,AM_PM=0,HOUR=11,
HOUR_OF_DAY=11,MINUTE=49,SECOND=8,MILLISECOND=394,ZONE_OFFSET=28800000,DST_OFFSET=0]
*/
}
public class Test2_Calendar常用方法 {
public static void main(String[] args) throws ParseException {
/*
Calendar常用方法:
public int get(int field) 获取某个字段的值。
日历中的字段:
Calendar.YEAR 年
Calendar.MONTH 月
Calendar.DAY_OF_MONTH 日
Calendar.HOUR_OF_DAY 时
Calendar.MINUTE 分
Calendar.SECOND 秒
....
public void set(int field,int value) 设置某个字段的值
public void add(int field,int amount)为某个字段增加/减少指定的值
扩展:
void setTime(Date date) 使用给定的 Date 设置此 Calendar 的时间。
boolean before(Object when) 判断此 Calendar 表示的时间是否在指定 Object 表示的时间之前,返回判断结果。
boolean after(Object when) 判断此 Calendar 表示的时间是否在指定 Object 表示的时间之后,返回判断结果。
*/
// 获取当前时间的日历对象
Calendar cal = Calendar.getInstance();
// 获取日历对象中属性的值
System.out.println(cal.get(Calendar.YEAR));// 2020
System.out.println(cal.get(Calendar.MONTH));// 7
System.out.println(cal.get(Calendar.DAY_OF_MONTH));// 11
System.out.println(cal.get(Calendar.HOUR_OF_DAY));// 12
// 设置某个字段的值
// 把cal日历对象中的YEAR字段的值改为1999
cal.set(Calendar.YEAR,1999);
System.out.println(cal.get(Calendar.YEAR));// 1999
// 对cal日历对象中的YEAR字段的值+1
cal.add(Calendar.YEAR,1);
System.out.println(cal.get(Calendar.YEAR));// 2000
// 对cal日历对象中的YEAR字段的值-1
cal.add(Calendar.YEAR,-1);
System.out.println(cal.get(Calendar.YEAR));// 1999
System.out.println("+=====================================");
// 需求:获取1999-10-10对应的日历对象
String birthday = "1999-10-10";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date birthdayDate = sdf.parse(birthday);
// 获取日历对象
Calendar cal1 = Calendar.getInstance();
cal1.setTime(birthdayDate);
System.out.println(cal1.get(Calendar.YEAR));// 1999
System.out.println(cal1.get(Calendar.MONTH));// 9
System.out.println(cal1.get(Calendar.DAY_OF_MONTH));// 10
System.out.println("+=====================================");
Calendar cal2 = Calendar.getInstance();
// 判断出生日期对应的日历对象cal1是否在当前日历对象cal2之后
System.out.println(cal1.after(cal2));// false;
// 判断出生日期对应的日历对象cal1是否在当前日历对象cal2之前
System.out.println(cal1.before(cal2));// true
}
}