Java8日期处理的新特性
1.获取当前的日期
java8中的LocalDate用于用于标识用于表示当天日期。和java.util.Date不同,它只有日期,不包含时间。当你仅需要表示日期时间时就用这个类
2.获取年、月、日信息
LocalDate提供了获取年、月、日的快捷方法,其实还包括很多其它的日期属性。通过调用这些方法就可以很方便的得到需要的的日期信息,不用像以前一样需要依赖java.util.Calendar类了
3.获取特定日期
在第一个例子里,我们通过静态方法now()非常容易地创建了当天日期。我们还可以调用另一个有用的工厂方法LocalDate.of()创建任意日期,该方法需要传入年、月、日做参数,返回对应的LocalDate实例。这个方法的好处是没有再犯老API的设计错误,比如年度起始于1900,月份是从0开始等等。日期所见即所得,例如下边的案例
4.判断两个日期是否相同
现实生活中有一类时间处理就是判断两个日期是否相等。在项目开发的时候总会遇到这样子的问题。
下面这个例子会帮助你用java8的方式去解决,LocalDate重载了equal方法,注意,如果比较的日期是字符型的,需要先解析成日期对象再作判断
5.检查像生日这种周期性事件
java中另一个日期时间的处理就是检查类似生日、纪念日、法定假日(国庆、春节等)、或者每个月固定时间发送邮件给客户这些周期性事件
java中如何检查这些节日或其它周期性事件呢?答案是MonthDay类。这个类组合了月份和日,去掉了年,这意味着可以用它判断每年都会发生的事件。和这个类相似的还有一个YearMonth类。这些类也都是不可变并且线程安全的值类型,下面通过MonthDay来检查周期性事件
6.获取当前时间
与获取日期例子很像,获取时间使用的是LocalTime类,一个只有时间没有日期的LocalDate的近亲。可以调用静态工厂方法now()来获取当前时间。默认的格式是mm:ss:nnn。
7.在现有的时间上增加小时
java8提供了更好的plusHours()方法替换add(),并且是兼容的。注意:这些方法返回一个全新的LocalTime实例,由于其不可变性,返回后一定要用变量赋值
8.如何计算一个星期后之后的日期
和上个例子计算两小时以后的时间类似,这个例子会计算一周后的日期。LocalDate日期不包含时间信息,它的plus()方法用来增加天、周、日,ChronoUnit类声明了这些时间单位。由于LocalDate也是不变类型,返回后一定要用变量赋值
可以用同样的方法增加1个月、1年、1小时甚至一个世纪
9.计算一年前或一年后的日期
接着上面的例子我们可以通过LocalDate的plus()方法增加天数、周数或月数。这个例子我们用minus()方法计算一年前后的日期
10.使用java8的Clock时钟类
java8增加了Clock时钟类用于获取当时的时间戳,或当前时区下的日期时间信息。以前用到System.currentTimeMillis()和TimeZone.getDefault()的地方都可用Clock替换。
11.判断日期是早于还是晚于另一个日期
LocalDate类有两类方法isBefore()和isAfter()用比较日期,调用isBefore()方法时,如果给定日期小于当前日期则返回true
12.处理时区
java8不仅分离了日期和时间,也把时区分离出来了。现在有一系列单独的类和ZoneId来处理特定时区,ZoneDateTime类来表示某时区下的时间
13.如何体现出固定日期
例如:表示信用卡到期这类固定日期,与MonthDay检查重复时间的例子相似,YearMonth是另一个组合类,用于表示信用卡到期日、FD到期日,期货期权到期日等。
还可以用这个类得到当月共有多少天,YearMonth实例的lengthOfMonth()方法可以返回当月的天数,在判断2月有28天还是29天时非常有用
14.检查闰年
LocalDate类还有一个很实用的方法isLeapYear()判断该实例是否是一个闰年,如果你还是想重新发明轮子,还有一个代码实例,纯java逻辑编写的判断闰年的程序
15.计算两个日期之间的天数和月数
有一个常见日期操作是计算两个日期之间的天数、周数或月数。java8中可以用来java.period类来做计算。下面这个例子中,我们计算了当天和将来某一天之间的月数
16.包含时差信息的日期和时间
ZoneOffset类用来表示时区,举例来说印度与GMT或UTC标准时区相差+05:30,可以通过ZoneOffset.of()静态方法来获取对应的时区,一旦得到了时差就可以通过传入LocalDateTime和ZoneOffset来创建一个OffSetDateTime对象
17.获取当前的时间戳
Instant类有一个静态工厂方法now()会返回当前的时间戳,如下所示:
18.使用预定义的格式化工具去解析格式化日期
java8引用了全新的日期时间格式工具,线程安全而且使用方便,它自带一些常用的内置格式化工具
下面这个例子使用了BASIC_ISO_DATE格式化工具将2021年5月24日格式化成20210524
java8日期时间API的重点
1)提供了javax.time.ZoneId获取时区。
2)提供了LocalDate和LocalTime类。
3)Java8的所有日期和时间API都是不可变类并且线程安全,而现有的Date和Calendar API中的java.util.Date和SimpleDateFormat是非线程安全的。
4)主包是java.time,包含了表示日期、时间、时间间隔的一些类。里面有两个子包java.time.format用于格式化,java.time,temporal用于更底层的操作。
5)时区代表了地球上某个区域内普遍使用的标准时间。每个时区都有一个代号,格式通常由区域/城市构成(Asia/Tokyo),再加上与格林威治或UTC的时差,例如:东京的时差为+09:00。