新的日期和时间API

旧版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的合体,同时表示了日期和时间,但是不带时区信息

    代码示例:

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);
    }
}
View Code

 

   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);
    }
}

 

 

 

  

    

 

    

    

 

    

  

  

posted @ 2020-02-21 16:42  鄙人取个名字好难  阅读(...)  评论(...编辑  收藏