旧版API缺陷
1.设计缺陷 :比如Calendar类的月份是从0开始计算
2.非线程安全:java.util.Date 是非线程安全的,所有的日期类都是可变的
3.时区处理麻烦:日期类并不提供国际化,没有时区支持,因此Java引入了java.util.Calendar和java.util.TimeZone类,但他们同样存在上述所有的问题
新版API
1.LocalDate,LocalTime
LocalDate:该类的实例是一个不可变对象,它只提供了简单的日期,并不包含当天的时间信息,也不附带任何与时区相关的信息。可以通过静态方法of(y,m,d)创建一个LocalDate实例,也可以通过now()获取当前日期.
LocalTime:一天中的时间,比如8:55:13,可以用LocalTime表示。可以使用of重载的工厂方法创建LocalTime实例
LocalDateTime:是LocalDate和LocalTime的合体,同时表示了日期和时间,但是不带时区信息
代码示例:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package Date; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.Month; public class Test { public static void main(String[] args) { // 获取当前的日期时间 LocalDateTime currentTime = LocalDateTime.now(); System.out.println("当前时间: " + currentTime); LocalDate date1 = currentTime.toLocalDate(); System.out.println("date1: " + date1); Month month = currentTime.getMonth(); int day = currentTime.getDayOfMonth(); int seconds = currentTime.getSecond(); System.out.println("月: " + month + ", 日: " + day + ", 秒: " + seconds); LocalDateTime date2 = currentTime.withDayOfMonth(10).withYear(2012); System.out.println("date2: " + date2); // 12 december 2014 LocalDate date3 = LocalDate.of(2014, Month.DECEMBER, 12); System.out.println("date3: " + date3); // 22 小时 15 分钟 LocalTime date4 = LocalTime.of(22, 15); System.out.println("date4: " + date4); // 解析字符串 LocalTime date5 = LocalTime.parse("20:15:30"); System.out.println("date5: " + date5); } }
2.操纵,解析和格式化日期
所有的日期时间对象均实现了Temporal接口,其静态或实例方法会创建一个对象的副本,而不会修改原来的对象。常见的方法如下:
方法名 | 是否是静态方法 | 描述 |
from | 是 | 根据传入的Temporal对象创建对象实例 |
now | 是 | 根据系统时钟创建Temporal对象 |
of | 是 | 由Temporal对象的某个布防创建该对象的实例 |
pares | 是 | 由字符串创建Temporal对象的实例 |
atOffset | 否 | 将Temporal对象和某个时区偏移相结合 |
atZone | 否 | 将Temporal对象和某个时区相结合 |
format | 否 | 使用格式器将Temporal对象转换为字符串 |
get | 否 | 读取Temporal对象的某一部分的值 |
minus | 否 | 通过将当前Temporal对象的值减去一定的时长创建该副本 |
plus | 否 | 通过将当前Temporal对象的值加上一定的时长创建该副本 |
with | 否 | 以该Temporal对象为模板,对某些状态进行修改创建该对象的副本 |
3.使用TemporalAdjuster.
可以使用重载版本的with方法,向其传递一个提供了更多定制化选择的TemporalAdjuster对象。
package Date; import java.time.DayOfWeek; import java.time.LocalDateTime; import java.time.temporal.TemporalAdjusters; public class TemporalAdjustersTest { public static void main(String[] args) { // 当前时间: 2020-02-21T16:32:01.492 LocalDateTime currentTime = LocalDateTime.now(); System.out.println("当前时间: " + currentTime); //nextDay: 2020-02-23T16:32:01.492 创建一个新的日期,并将其值设定为日期调整后,第一个符合指定星期几要求的日期。如果该日期已符合要求,直接返回该对象 LocalDateTime nextDay = currentTime.with(TemporalAdjusters.nextOrSame(DayOfWeek.SUNDAY)); System.out.println("nextDay: " + nextDay); //firstDay: 2020-02-01T16:37:38.789 创建一个日期,它的值为当月的第一天 LocalDateTime firstDay = currentTime.with(TemporalAdjusters.firstDayOfMonth()); System.out.println("firstDay: " + firstDay); } }