在Java编程中,处理日期和时间是一项常见且重要的任务。Java提供了多种方式来处理日期和时间,其中最常用的是Date、Calendar、DateFormat和SimpleDateFormat类。本文将深入解析这些类的功能和用法。
一.Date
用来处理日期和时间,这个类JDK1.0就有了,当时设计的并不周全,但该类的大部分构造器、方法均已过时。但是很多以前的项目已经使用这个类了,而且很多人习惯使用这个类。下面是常用方法的简单说明。
1.1.构造方法
- Date():创建代表当前时间的 Date 对象,底层调用 System 类获取当前时间毫秒数。
- Date(long date):根据指定的时间毫秒数创建 Date 对象,参数为时间的毫秒数。
1.2.成员方法
- boolean after(Date when):判断该时间是否在指定时间之后。
- boolean before(Date when):判断该时间是否在指定时间之前。
- long getTime():返回该时间的毫秒数。
- void setTime(long time):以毫秒数的形式,设置该 Date 对象所代表的时间。
1.3.案例
public static void main(String[] args) throws ParseException {
Date d1 = new Date();
//返回该时间的毫秒数long值
System.out.println(d1.getTime());
//当前时间+1秒
Date d2 = new Date(System.currentTimeMillis() + 1000);
System.out.println(d2.getTime());
//判断d1是否在d2之后
System.out.println(d1.after(d2));
//判断d1是否在d2之前
System.out.println(d1.before(d2));
//比较
//d1<d2返回-1 d1=d2返回0、d1>d2 返回1
System.out.println(d1.compareTo(d2));
//设置时间 d2+1秒
d2.setTime(d2.getTime() + 1000);
System.out.println(d2.getTime());
}
二.Calendar(推荐使用)
Calendar类是一个抽象类,它是一个日历,可以处理日期、时间、年、月、日等。它比Date类提供了更多的灵活性和功能。推荐使用Calendar 。Calendar 类提供了自动进位的功能,这意味着当你设置一个字段的值超出了其允许的范围时(比如2月没有31天),Calendar 类会自动调整相关的字段以保持日期和时间的有效性(如果设置了2月31号,就会自动进位到3月)。这种特性在处理日期和时间时非常有用,因为它简化了字段之间的相互影响。
2.1.实例化 Calendar
- Calendar 是一个抽象类,不能通过构造器创建 Calendar 对象;
- Calendar 类提供了静态方法 getInstance(),用以创建实例;
2.2.与 Date 互转
- Date getTime():Calendar的getTime方法返回的是Date类型,而Date的getTime返回的是long.
- void setTime(Date date):设置此 Calendar 实例的当前时间,参数为一个 Date 对象。
2.3.静态常量
- YEAR,MONTH,DATE,HOUR,MINUTE,SECOND,MILLISECOND 等日历字段。
2.4.成员方法
- int get(int field):返回指定字段的值(传入静态常量,返回具体的值);
- void add(int field, int amount):给指定的字段增加一个值;
- void set(int field, int value):给指定的字段设置一个值;
- void set(int year, int month, int date):设置年、月、日的值;
- void set(int year, int month, int date, int hourOfDay, int minute, int second):设置年月日时分秒的值;
2.3.案例
public static void main(String[] args) {
//默认表达当前时间
Calendar c = Calendar.getInstance();
//分别获取年月日时分秒毫秒,get方法返回int
System.out.println(c.get(Calendar.YEAR)); //2025
//月份从默认0开始,所以的到之后要+1
System.out.println(c.get(Calendar.MONTH) + 1); //1
System.out.println(c.get(Calendar.DATE)); //21
System.out.println(c.get(Calendar.HOUR)); //9
System.out.println(c.get(Calendar.MINUTE)); //12
System.out.println(c.get(Calendar.SECOND)); //4
System.out.println(c.get(Calendar.MILLISECOND)); //221
//getTime Calendar转换Date
Date date = c.getTime();
System.out.println(date); //Tue Jan 21 21:15:40 CST 2025
//修改日期(年月日) 2025年1月30。month默认从0开始,0就是1月
c.set(2025,0,30);
System.out.println(c.getTime()); //Sun Mar 02 21:15:40 CST 2025
//修改日期(年月日时分秒)
c.set(2025,0,30,10,10,10);
System.out.println(c.getTime()); //Thu Jan 30 10:10:10 CST 2025
//修改任意字段,将月份修改为2月。上面将日期改为了1月30.此时将月份改为2月
//但由于2月没有30天,所以自动进位成3月2日。
//根据传入的常量修改,传入YEAR修改年........
c.set(Calendar.MONTH,1);
System.out.println(c.getTime()); //Sun Mar 02 10:10:10 CST 2025
//指定字段加减(正数是+,负数是-)
c.add(Calendar.YEAR,2);
System.out.println(c.get(Calendar.YEAR)); //2027
c.add(Calendar.YEAR,-1);
System.out.println(c.get