1、Date类
现实生活中,日期时间类的数据很常见。Java中提供了Date类来封装当前的时间类和日期。api文档说明如下:
1.1、构造方法
很多构造方法都已经被弃用了,目前Date类的构造方法就两种:
- Date():分配一个Date对象并对其进行初始化,以便它表示分配的时间,测量到最近的毫秒,即获取到系统的当前时间。
- Date(long date):接受一个long型的参数,分配一个Date对象,并将其初始化为表示从标准基准时间(称为“时代”)即1970年1月1日00:00:00 GMT起的指定毫秒数。
public static void main(String[] args) {
Date d1 = new Date();
// 获取当前时间的毫秒数
long mils = d1.getTime();
System.out.println("当前日期:" + d1);
Date d2 = new Date(mils);
System.out.println("当前日期:" + d2);
}
控制台:
1.2、常用方法
Date类提供的方法如下:
Date类的大部分方法都被弃用了,官方不再提倡我们使用,取而代之的是DateFormat类和Calendar类中的方法,现对Date类未被弃用的一些常用方法进行说明:
- after(Date d):测试此日期是否在给定日期之后,返回布尔值。
- before(Date d):测试此日期是否在给定日期之前,返回布尔值。
- compareTo(Date d):比较,一样返回0,在之前返回-1,在之后返回1。
- equals(Object obj):比较两个日期是否相等,返回布尔值。
- getTime():返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数,返回long型数据。
- setTime(long time):用自1970年1月1日00:00:00 GMT以后time毫秒数设置时间和日期。
- hashCode():返回此日期的哈希码值。
- toString():转为String串。
1.3、日期的格式化
有时候需要将日期按照指定的格式来进行输出,这时可以使用SimpleDateFormat类来格式化日期。SimpleDateFormat是一个以语言环境敏感的方式来格式化和分析日期的类。SimpleDateFormat 允许你选择任何用户自定义日期时间格式来运行。使用该类可以轻松的实现日期和文本之间的相互转换。api文档中说明如下:
常用的符号说明如下:
符号说明:
构造方法如下:
提供的方法如下:
用的较多的是以下两种方法:
- format(Date d):将日期转换为字符串形式,返回String类型。
- parse(String s):将字符串转换为日期格式,返回Date类型,但是s的格式还是要满足日期格式的要求,否则识别不了会转换失败。
以下通过两个例子来说明:
public static void main(String[] args) {
Date d1 = new Date();
// 获取当前时间的毫秒数
long mils = d1.getTime();
long mils2 = d1.getTime() + 10000000;
// 重设d1日期
d1.setTime(mils2);
Date d2 = new Date(mils);
Date d3 = new Date(mils2);
System.out.println();
System.out.println("d1日期:" + d1);
System.out.println("d2日期:" + d2);
System.out.println("d3日期:" + d3);
System.out.println("d2在d3之前吗?" + d2.before(d3));
System.out.println("d2在d3之后吗?" + d2.after(d3));
System.out.println("d2和d3是同一个时间吗?" + d2.equals(d3));
System.out.println("d2的哈希码值:" + d2.hashCode());
System.out.println("d3的哈希码值:" + d3.hashCode());
System.out.println(d2.compareTo(d3));
System.out.println(d3.toString());
}
控制台:
定义一个实体类Student:
public class Student {
private String name;
private String sex;
private Date birth;
public Student(String name, String sex, Date birth) {
this.name = name;
this.sex = sex;
this.birth = birth;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Date getBirth() {
return birth;
}
public void setBirth(Date birth) {
this.birth = birth;
}
}
测试:
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("开始录入学生信息!");
System.out.println("请输入姓名:");
String name = in.next();
System.out.println("请输入性别:");
String sex = in.next();
System.out.println("请输入出生年份:");
int year = in.nextInt();
System.out.println("请输入出生月份:");
int month = in.nextInt();
System.out.println("请输入出生的日");
int day = in.nextInt();
String birthStr = year + "-" + month + "-" + day;
Student stu = new Student(name, sex, stringToDate("yyyy-MM-dd", birthStr));
System.out.println("-----------------------");
System.out.println("学生信息如下:");
System.out.println("姓名:" + stu.getName());
System.out.println("性别:" + stu.getSex());
System.out.println("出生日期:" + dateToString("yyyy年MM月dd日", stu.getBirth()));
}
// 定义一个方法,将字符串转换为日期
private static Date stringToDate(String pattern, String dateStr) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
try {
Date date = simpleDateFormat.parse(dateStr);
return date;
} catch (ParseException e) {
e.printStackTrace();
return null;
}
}
// 定义一个方法,日期转换为字符串
private static String dateToString(String pattern, Date date) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
String dateStr = simpleDateFormat.format(date);
return dateStr;
}
执行,控制台:
2、Calendar类
使用Date类已经能够格式化并创建一个日期对象了,但是如何才能设置和获取日期数据的特定部分呢,比如说小时,日,或者分钟, 又如何在日期的这些部分加上或者减去值呢, 这时可以使用Calendar 类。Calendar类的功能要比Date类强大很多,在实现方式上稍微复杂一些。
Calendar类是一个抽象类,在实际使用时实现特定的子类的对象,使用getInstance方法创建即可。api文档说明如下:
如果我现在想获取一个Calendar对象,那么只需:
Calendar cal = Calendar.getInstance();
因为Calendar是抽象类,自身是不能实例化的,Calendar.getInstance()来获取一个Calendar对象。
常用的常量如下:
提供的方法如下:
常用的方法说明如下:
- add(int field, int amount):根据日历的规则,将指定的时间量添加或减去给定的日历字段。
- after(Object when):返是否在日期之后,返回布尔值。
- before(Object when):返是否在日期之前,返回布尔值。
- clear(int field):清除指定字段的值。
- compareTo(Calendar cal):比较前后,在之前返回-1,一样返回0,在之后返回1。
- equals(Object obj):比较两个日期是否相同,返回布尔值。
- get(int field):返回给定日历字段的值。
- Calendar.getInstance() :获取一个Calendar对象。
- getTime():返回一个Date表示此物体Calendar的时间值
- set(…):设置日历中的字段值,此方法有多个重载方法。
以下用代码测试:
public static void main(String[] args) {
// 获取Calendar对象
Calendar cal = Calendar.getInstance();
// 设置日历字段
cal.set(1995, 9, 18);
// 获取日历中的字段
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH );
int day = cal.get(Calendar.DAY_OF_MONTH);
String dateStr = year + "年" + month + "月" + day + "日";
System.out.println(dateStr);
Date date = cal.getTime();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
System.out.println(sdf.format(date));
}
控制台:
这里其实可以看到一个问题,那就是Calendar在转为Date类型的时候,月份是不一样的,Calendar中的0-11代表1-12月,也就是说上面的9其实是表示的10月份,那么在转换的时候可以将month减去1。
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
Student stu0 = new Student();
Student stu2 = new Student();
System.out.println("开始录入第一个人的信息!");
System.out.println("请输入姓名:");
String name0 = in.next();
System.out.println("请输入性别:");
String sex0 = in.next();
System.out.println("请输入出生年份:");
int year = in.nextInt();
System.out.println("请输入出生月份:");
int month0 = in.nextInt();
System.out.println("请输入出生的日:");
int day0 = in.nextInt();
stu0.setName(name0);
stu0.setSex(sex0);
Calendar cal0 = Calendar.getInstance();
cal0.set(year, month0 - 1, day0);
Date d0 = cal0.getTime();
stu0.setBirth(d0);
System.out.println("---------------------");
System.out.println("开始录入第二个人的信息!");
System.out.println("请输入姓名:");
String name2 = in.next();
System.out.println("请输入性别:");
String sex2 = in.next();
System.out.println("请输入出生年份:");
int year2 = in.nextInt();
System.out.println("请输入出生月份:");
int month2 = in.nextInt();
System.out.println("请输入出生的日:");
int day2 = in.nextInt();
stu2.setName(name2);
stu2.setSex(sex2);
Calendar cal2 = Calendar.getInstance();
cal2.set(year2, month2 - 1, day2);
Date d2 = cal2.getTime();
stu2.setBirth(d2);
System.out.println("----------------------------");
System.out.println("第一个人信息如下:");
System.out.println("姓名:" + stu0.getName());
System.out.println("性别:" + stu0.getSex());
System.out.println("出生日期:" + dateToString("yyyy年MM月dd日", stu0.getBirth()));
System.out.println("----------------------------");
System.out.println("第二个人信息如下:");
System.out.println("姓名:" + stu2.getName());
System.out.println("性别:" + stu2.getSex());
System.out.println("出生日期:" + dateToString("yyyy年MM月dd日", stu2.getBirth()));
System.out.println("第一个人出生在第二个人之前吗?" + cal0.before(cal2));
}
// 定义一个方法,日期转换为字符串
private static String dateToString(String pattern, Date date) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
String dateStr = simpleDateFormat.format(date);
return dateStr;
}
执行,控制台:
3、GregorianCalendar类
Calendar类实现了公历日历,该类是Calendar类的一个具体实现。Calendar 的getInstance()方法返回一个默认用当前的语言环境和时区初始化的GregorianCalendar对象。GregorianCalendar定义了两个字段:AD和BC。这是代表公历定义的两个时代。
构造方法如下:
提供的方法如下:
以下用代码说明:
public static void main(String[] args) {
GregorianCalendar calendar = new GregorianCalendar();
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DAY_OF_MONTH);
int hour = calendar.get(Calendar.HOUR_OF_DAY);
int minute = calendar.get(Calendar.MINUTE);
int second = calendar.get(Calendar.SECOND);
System.out.println("当前日期为:" + year + "年" + (month + 1) + "月" + day + "日!");
System.out.println("当前时间为:" + hour + "时" + minute + "分" + second + "秒!");
if (calendar.isLeapYear(year)) {
System.out.println("当前年份是闰年!");
} else {
System.out.println("当前年份不是闰年!");
}
}
执行,控制台:
4、总结
日期时间类在实际中用的比较多,掌握Date类、Calendar类,以及Calendar类的子类GregorianCalendar的定义和一些常用方法,掌握日期和字符串的相互转换,在开发中肯定会用到。