在整个Java程序设计的过程之中,日期时间是一个非常重要的话题,同时几乎所有的项目开发都不可能离开日期时间的处理操作,而整个的Java里面针对日期时间也提供有一系列的工具类供开发者使用。
Date类
java.util.Date类是在Java之中获得日期时间操作的最简单的一个程序类,这个类可以直接通过对象实例化Date类对象的形式获取当前的日期时间。
范例:
import java.util.Date;
public class Test {
public static void main(String[] args) {
System.out.println(new Date());
}
}
执行结果:
Wed May 27 13:52:39 CST 2020
Date里面所给出的日期时间默认格式采用的是国外人的习惯,所有中国人民肯定不习惯,但是它已经可以包含正确的信息,如果要想进行更加详细的处理,后面会有专门的类。
在整个Date类里面也提供有如下的一下操作方法。
在之前讲解数据类型划分的时候就重点强调了:在Java程序里面,日期时间,内存大小或者文件大小都是用long数据类型来进行描述。
在Date类里面通过构造方法可以结构一个long日期时间的数字,也可以通过Date返回一个long类型的数据。
如果要想清楚的理解Date类之中,两个构造彼此之间的关系,最佳的做法还是需要浏览一下Date类的构造方法的源代码。
所谓的无参构造方法实际上会自动进行单参构造的调用,并且传递的参数也是System类之中所获得的时间日期数值。
范例:long与Date类之间的转换操作
import java.util.Date;
public class Test {
public static void main(String[] args) {
long dateTime = System.currentTimeMillis() - 10000; //得到了long的数据类型
Date dateA = new Date(dateTime);
Date dateB = new Date();
System.out.println(dateA);
System.out.println(dateB);
System.out.println("两个日期之间所差的毫秒数:" + (dateB.getTime() - dateA.getTime()));
}
}
输出:
Wed May 27 14:05:19 CST 2020
Wed May 27 14:05:29 CST 2020
两个日期之间所差的毫秒数:10001
Calendar类
在整个Java里面,虽然Date可以描述时间,但是除了日期时间之外还有许多与日历有关的操作,例如:假设需要知道某一个日期所在月的某一天,或者说判断某一个日期是否处于闰年,对于这些繁琐的日期处理操作,在Java里面就可以采用java.util.Calendar程序类完成相应的处理操作。
首先观察一下Calendar类的基本定义:
public abstract class Calendar implements Serializable, Cloneable, Comparable
发现Calender类属于一个抽象类,那么按照原始的概念来理解的话,这个时候应该通过子类进行对象的实例化。
而通过JavaDoc的文档发现有一个RegorianCalendar子类。但是这个时候继续观察一下Calendar提供的方法,会发现提供了一个获取Calendar对象实例的静态方法。
public static Calendar getInstance()
范例:得到当前的日期时间
import java.util.Calendar;
public class Test {
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance(); //获取对象实例
System.out.println(String.format("当前的日期时间格式: %s-%s-%s %s:%s:%s",
calendar.get(Calendar.YEAR),
calendar.get(Calendar.MONTH) + 1,
calendar.get(Calendar.DAY_OF_MONTH),
calendar.get(Calendar.HOUR_OF_DAY),
calendar.get(Calendar.MINUTE),
calendar.get(Calendar.SECOND)
));
}
}
输出:
当前的日期时间格式: 2020-5-27 14:22:53
非常抱歉的是在使用Calendar类获取日期时间数值的时候一般都需要进行一些补0的处理,但是获得当前的日期时间并不是Calendar的主要作用,这个类主要使用的是日历的计算。
范例:实现日期的准确计算
import java.util.Calendar;
public class Test {
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance(); //获取对象实例
calendar.add(Calendar.MONTH,6); //计算半年之后的日期
calendar.add(Calendar.YEAR,30); //30年之后
System.out.println(String.format("当前的日期时间格式: %s-%s-%s %s:%s:%s",
calendar.get(Calendar.YEAR),
calendar.get(Calendar.MONTH) + 1,
calendar.get(Calendar.DAY_OF_MONTH),
calendar.get(Calendar.HOUR_OF_DAY),
calendar.get(Calendar.MINUTE),
calendar.get(Calendar.SECOND)
));
}
}
输出:
当前的日期时间格式: 2050-11-27 14:26:17
如果此时没有采用这样的操作类进行日期的处理,而是使用long进行计算,那么得到的日期时间一定是不准确的。既然Calender描述的是一个日期结构,就可以考虑进行日期上的调用。
范例:找到8月的最后一天
import java.util.Calendar;
public class Test {
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance(); //获取对象实例
calendar.set(calendar.get(Calendar.YEAR) , 8,1); //通过9月计算8月最后一天
calendar.add(Calendar.DATE , -1); //9月的最后一天减 1
System.out.println(String.format("当前的日期时间格式: %s-%s-%s %s:%s:%s",
calendar.get(Calendar.YEAR),
calendar.get(Calendar.MONTH) + 1,
calendar.get(Calendar.DAY_OF_MONTH),
calendar.get(Calendar.HOUR_OF_DAY),
calendar.get(Calendar.MINUTE),
calendar.get(Calendar.SECOND)
));
}
}
输出:
当前的日期时间格式: 2020-8-31 14:31:1
如果要想进行指定日期的最后一天的操作,则就应该定位到指定的日期上,随后再利用一些加减的操作获取日期数据,由于本程序需要获取到8月的最后一天,那么就将日期设置为9月的第一天,然后利用add()方法在天数上做一个-1的操作,就变为了8月的最后一天。
SimpleDateFormat
通过之前的对比可以发现使用Date类获取日期时间要比Calendar类获取的日期时间更加的简单(Calendar类功能不在于数据的获取,而在于日期的计算上),可是通过Date类获取的时间(Wed May 27 14:37:14 CST 2020)实在是不方便阅读。
所以在实际的开发之中就会存在一种格式化日期的操作,而这种处理操作主要依靠java.text.SimpleDateFormat类完成。
这个类有如下的几个操作方法:
如果要想成功的对日期进行格式化或者将字符串转为日期,那么就必须要存在有一个日期时间的匹配表达式,而这组表达式里面最重要的几个日期时间单位:年(yyyy)、月(MM)、日(dd)、时(HH)、分(mm)、秒(ss)、毫秒(SS)。
范例:
import java.text.SimpleDateFormat;
import java.util.Date;
public class Test {
public static void main(String[] args) {
Date date = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(simpleDateFormat.format(date));
}
}
输出:
2020-05-27 14:46:28
这个时候所获得的日期时间的字符串的信息就非常符合国人的使用习惯了,采用类似的匹配表达式,也可以实现字符串转为日期时间的处理。
范例:字符串转日期
import java.text.ParseException;
import java.text.SimpleDateFormat;
public class Test {
public static void main(String[] args) throws ParseException {
String str = "2020-05-27 14:46:28";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(simpleDateFormat.parse(str));
}
}
输出:
Wed May 27 14:46:28 CST 2020