在Java8之前,要使用时间处理,通常需要用到Date
类,这个方法已经能够解决很多问题。这种日期时间处理方式如下:
1 传统的日期时间处理方法
1.1 Date类
java.util.Date
类是整个程序的处理中可以直接获得当前日期实例化对象的类。而且,推荐仅仅使用util包中的Date实现日期操作。
1. 直接通过无参构造函数实例化的Date对象描述的是当前的日期时间。
public class DateDemo {
public static void main(String args[]){
Date date = new Date();
System.out.println(date);
}
}
2. Date类中现在仅仅推荐两个方法使用,其他的方法均属于过期方法,不再推荐
除了下面的两个方法之外,其他的方法或多或少存在设计上的缺陷。
- 将long型数据转成Date对象:
new Date(long x)
- 将Date对象转成long型:
new Date().getTime()
public class DateDemo {
public static void main(String args[]){
long date = new Date().getTime();
System.out.println(date);
long x = 1506861299655L;
System.out.println(new Date(x));
}
}
1.2 SimpleDateFormat
虽然可以通过Date类进行日期操作,但是这种方式获取的时间不太适合国人的阅读习惯。因此,需要引入SimpleDateFormat类。
观察要用到的SimpleDateFormat类的继承关系可以发现,其构造函数接收的是一个字符串类型的模式参数,而他的父类是一个抽象类,里面有format方法可以进行日期到字符串的转换;里面还有一个方法parse可以进行字符串到日期的转换。那么就可以得出这样的结论:
- SimpleDateFormat对象能够继承父类的format方法,将Date对象转换成其构造函数中指定的模式的字符串;
- SimpleDateFormat对象能够继承父类的parse方法,将格式化的字符串参数转换成对应模式下的Date对象。
一个典型的Date格式化输入/出范例
public class FormattedDate {
public static void main(String args[]) throws ParseException {
Date date = new Date();
// 按照设置的格式,转换当前日期为字符串类型
String pattern = "yyyy-MM-dd HH:mm:ss.SSS";
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
System.out.println("按照设置的格式,转换当前日期为字符串类型");
System.out.println(sdf.format(date));
//将字符串类型,按照指定的格式转换成Date类型
String now = "2017-10-01 20:50:02.448";
System.out.println("将字符串类型,按照指定的格式转换成Date类型");
System.out.println(sdf.parse(now));
}
}
需要说明的是,日期模式的格式化对应标识:
标识 | 含义 |
---|---|
yyyy | 四位数标识的年份 |
MM | 两位数标识的月份 |
dd | 两位数标识的天数 |
HH | 两位数标识的24小时制小时数 |
mm | 两位数标识的分钟数 |
ss | 两位数标识的秒数 |
SSS | 三位数标识的毫秒数 |
一个典型的时间格式化标识方式: "yyyy-MM-dd HH:mm:ss.SSS"。
如果格式化的时候,你的时间写错了,SimpleDateFormat这个类会自动向上或者向下转型,不会报错。因此,转换时候需要注意确保日期写对了。
2 Java8之后的扩展方法
上述的日期时间解决方案已经能够基本解决我们的问题,不过,为了能够有效的实现日期时间操作,最新的java8中提供的LocalDate
类和LocalTime
类 等来扩充之前的日期时间操作。
2.1 LocalDate
Java8中的LocalDate表示的是当天日期,并且不包含时间。
例如,当你仅需要表示日期的时候,可以直接使用如下代码:
LocalDate now = LocalDate.now();
System.out.println(now);
上述代码执行结果:
2018-10-2
此外,该类还提供了:
- 获取年月日等快捷方法,如
int year=now.getYear();
- 处理特定日期:可以调用LocalDate.of()创建任意日期。例如:
LocalDate.of(2018,06,20)
- 判断两个日期是否相同,可以直接使用实例的
equals
方法:例如
LocalDate now = LocalDate.now();
LocalDate today = LocalDate.of(2018,10,02);
if(today.equals(now)){
System.out.println("同一天")
}
- 检查如生日等周期性的事件等
- 增加天/周/月等:
plus(...)
:例如,计算一周后的日期:now.plus(1, ChronoUnit.WEEKS)
。 - 减少天/周/月/年等:
minus(...)
- 比较两个日期早晚:
isBefore()
和isAfter()
- 检查闰年:
isLeapYear()
2.2 LocalTime
与Java8中获取日期的例子相似,在Java8中, LocalTime
类仅用于表示当前事件,不包含日期。其默认的静态工厂方法now()
可以表示的时间格式为:hh:mm:ss:nnn
。
LocalTime localTime = LocalTime.now();
System.out.println(localTime);
执行结果:
13:35:56.155
此外,该类还可以提供诸多的扩展功能。例如:
- 在当前时间上增加小时:
plusHours(...)
- 在当前时间下减少等。
2.3 Period
Java8中提供了java.time.Period类来计算两个日期之间的天数,周数或者月数。例如: 我们计算了当天和捡来某一天之间的月数。
LocalDate date = LocalDate.of(2022,09,21);
Period period = Period.between(date, LocalDate.now());
System.out.println("离下次时间还有:", period);