JDK1.8新特性之时间和日期的使用

LocalDate

该类的实例是一个不可变对象,它只提供了简单的日期,并不含当天的时间信息。另外,它也不附带任何与时区相关的信息

public class LocalDataTest {
    public static void main(String[] args) {
        //你可以通过静态工厂方法of创建一个LocalDate实例。LocalDate实例提供了多种方法来读取常用的值,比如年份、月份、星期几等,如下所示。
        LocalDate date = LocalDate.of(2014, 3, 18);
        System.out.println("date.getYear() = " + date.getYear());
        System.out.println("date.getMonth() = " + date.getMonth());
        System.out.println("date.getDayOfMonth() = " + date.getDayOfMonth());
        System.out.println("date.getDayOfWeek() = " + date.getDayOfWeek());
        System.out.println("date.lengthOfMonth() = " + date.lengthOfMonth());
        System.out.println("date.isLeapYear() = " + date.isLeapYear());
​
​
        //你还可以通过传递一个TemporalField参数给get方法拿到同样的信息。
        // TemporalField是一个接口,它定 义了如何访问temporal对象某个字段的值。
        // ChronoField枚举实现了这一接口,所以你可以很方便地使用get方法得到枚举元素的值
        System.out.println("date.get(ChronoField.YEAR) = " + date.get(ChronoField.YEAR));
        System.out.println("date.get(ChronoField.MONTH_OF_YEAR) = " + date.get(ChronoField.MONTH_OF_YEAR));
        System.out.println("date.get(ChronoField.DAY_OF_MONTH) = " + date.get(ChronoField.DAY_OF_MONTH));
​
​
        //你还可以使用工厂方法从系统时钟中获取当前的日期:
        LocalDate today = LocalDate.now();
        System.out.println("today.getDayOfMonth() = " + today.getDayOfMonth());
        System.out.println("today.getDayOfWeek() = " + today.getDayOfWeek());
        System.out.println("today.getYear() = " + today.getYear());
        System.out.println("today.getMonth() = " + today.getMonth().getValue());
    }
​
}

打印信息如下:

date.getYear() = 2014
date.getMonth() = MARCH
date.getDayOfMonth() = 18
date.getDayOfWeek() = TUESDAY
date.lengthOfMonth() = 31
date.isLeapYear() = false
date.get(ChronoField.YEAR) = 2014
date.get(ChronoField.MONTH_OF_YEAR) = 3
date.get(ChronoField.DAY_OF_MONTH) = 18
today.getDayOfMonth() = 20
today.getDayOfWeek() = FRIDAY
today.getYear() = 2019
today.getMonth() = 12

LocalTime

类似地,一天中的时间,比如13:45:20,可以使用LocalTime类表示。

public class LocalDataTest2 {
    public static void main(String[] args) {
        //你可以使用of重载的两个工厂方法创建LocalTime的实例。第一个重载函数接收小时和分钟,第二个重载函数同时还接收秒。
        // 同LocalDate一样,LocalTime类也提供了一些getter方法访问这些变量的值,如下所示。
        LocalTime time = LocalTime.of(13, 45, 20);
        System.out.println("time.getHour() = " + time.getHour());
        System.out.println("time.getMinute() = " + time.getMinute());
        System.out.println("time.getSecond() = " + time.getSecond());
    }
}

打印信息如下:

time.getHour() = 13
time.getMinute() = 45
time.getSecond() = 20

LocalDate和LocalTime还可以通过解析代表它们的字符串创建,使用静态方法parse,你可以实现这一目的。

public class LocalDataTest3 {
    public static void main(String[] args) {
        //你可以向parse方法传递一个DateTimeFormatter。该类的实例定义了如何格式化一个日期或者时间对象。
        //它是替换老版java.util.DateFormat的推荐替代品。
​
        //一旦传递的字符串参数无法被解析为合法的LocalDate或LocalTime对象,这两个parse方法都会抛出一个继承自RuntimeException的DateTimeParseException异常
        LocalDate date = LocalDate.parse("2014-03-18");
        System.out.println("date.getMonth() = " + date.getMonth().getValue());
        LocalTime time = LocalTime.parse("13:45:20");
        System.out.println("time.getHour() = " + time.getHour());
    }
}

LocalDateTime

这个复合类名叫LocalDateTime,是LocalDate和LocalTime的合体。它同时表示了日期和时间,但不带有时区信息,你可以直接创建,也可以通过合并日期和时间对象构造

public class LocalDataTest4 {
    public static void main(String[] args) {
        // 2014-03-18T13:45:20
        LocalDateTime dt1 = LocalDateTime.of(2014, Month.MARCH, 18, 13, 45, 20);
​
        //你也可以使用 或toLocalDate者toLocalTime方法,从LocalDateTime中提取LocalDate或者LocalTime 组件
        LocalDate date = dt1.toLocalDate();
        LocalTime time = dt1.toLocalTime();
​
        LocalDateTime dt2 = LocalDateTime.of(date, time);
        //注意,通过它们各自的atTime或者atDate方法,向LocalDate传递一个时间对象,或者向LocalTime传递一个日期对象的方式,你可以创建一个LocalDateTime对象
        LocalDateTime dt3 = date.atTime(13, 45, 20);
        LocalDateTime dt4 = date.atTime(time);
        LocalDateTime dt5 = time.atDate(date);
​
    }
}

我们可以用比较直观的方式操纵LocalDate的属性

public class LocalDataTest5 {
    public static void main(String[] args) {
        LocalDate date1 = LocalDate.of(2014, 3, 18);  //2014-3-18
        LocalDate date2 = date1.withYear(2011);     //2011-3-18
        LocalDate date3 = date2.withDayOfMonth(25);     //2011-3-25
        LocalDate date4 = date3.with(ChronoField.MONTH_OF_YEAR, 9);     //2011-9-25
    }
}

或者用类似plus方法去操控

public class LocalDataTest6 {
    public static void main(String[] args) {
        //plus方法也是通用方法,它和minus方法都声明于Temporal接口中。
        //通过这些方法,对TemporalUnit对象加上 或者减去一个数字,我们能非常方便地将Temporal对象前溯或者回滚至某个时间段,
        //通过 ChronoUnit 枚举我们可以非常方便地实现TemporalUnit接口
        LocalDate date1 = LocalDate.of(2014, 3, 18);        //2014-3-18
        LocalDate date2 = date1.plusWeeks(1);       //2014-3-25
        LocalDate date3 = date2.minusYears(3);      //2011-3-25
        LocalDate date4 = date3.plus(6, ChronoUnit.MONTHS); //2011-9-25
    }
}

DateTimeFormatter

处理日期和时间对象时,格式化以及解析日期-时间对象是另一个非常重要的功能。新的java.time.format包就是特别为这个目的而设计的。这个包中,最重要的类是DateTime-Formatter。创建格式器最简单的方法是通过它的静态工厂方法以及常量。像BASIC_ISO_DATE 8和ISO_LOCAL_DATE这 样 的 常 量 是DateTimeFormatter类 的 预 定 义 实 例 。 所 有 的 DateTimeFormatter实例都能用于以一定的格式创建代表特定日期或时间的字符串。比如,下面的这个例子中,我们使用了两个不同的格式器生成了字符串:

public class LocalDataTest7 {
    public static void main(String[] args) {
        LocalDate date = LocalDate.of(2014, 3, 18);
        System.out.println(date.format(DateTimeFormatter.BASIC_ISO_DATE));
        System.out.println(date.format(DateTimeFormatter.ISO_LOCAL_DATE));
​
        LocalDate date1 = LocalDate.parse("20140318",
                DateTimeFormatter.BASIC_ISO_DATE);
        LocalDate date2 = LocalDate.parse("2014-03-18",
                DateTimeFormatter.ISO_LOCAL_DATE);
    }
}

DateTimeFormatter的ofPattern方法也提供了一个重载的版本,使用它你可以创建某个Locale的格式器

public class LocalDataTest8 {
    public static void main(String[] args) {
        //DateTimeFormatter的ofPattern方法也提供了一个重载的版本,使用它你可以创建某个Locale的格式器
        DateTimeFormatter formatter =
                DateTimeFormatter.ofPattern("yyyy年MM月dd日");
        LocalDate date = LocalDate.of(2014, 3, 18);
        System.out.println(date.format(formatter));
​
        //下面为传统的格式化时间类
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日");
        System.out.println(dateFormat.format(System.currentTimeMillis()));
    }
}

Date与这几个类的互相转换

public class DateUtil {
    /**
     * Date转LocalDateTime
     *
     * @param date
     * @return
     */
    public static LocalDateTime UDateToLocalDateTime(Date date) {
        Instant instant = date.toInstant();
        ZoneId zone = ZoneId.systemDefault();
        return LocalDateTime.ofInstant(instant, zone);
    }
​
    /**
     * Date转LocalDate
     */
    public static LocalDate UDateToLocalDate(Date date) {
        Instant instant = date.toInstant();
        ZoneId zone = ZoneId.systemDefault();
        LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zone);
        return localDateTime.toLocalDate();
    }
​
    /**
     * Date转TimeToUpdate
     */
    public static LocalTime UDateToLocalTime(Date date) {
        Instant instant = date.toInstant();
        ZoneId zone = ZoneId.systemDefault();
        LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zone);
        return localDateTime.toLocalTime();
    }
​
    /**
     * LocalDateTime转Date
     */
    public static Date LocalDateTimeToUdate(LocalDateTime localDateTime) {
        ZoneId zone = ZoneId.systemDefault();
        Instant instant = localDateTime.atZone(zone).toInstant();
        return Date.from(instant);
    }
​
    /**
     * LocalDate转Date
     */
    public static Date LocalDateToUdate(LocalDate localDate) {
        ZoneId zone = ZoneId.systemDefault();
        Instant instant = localDate.atStartOfDay().atZone(zone).toInstant();
        return Date.from(instant);
    }
​
    /**
     * LocalTime转Date
     */
    public static Date LocalTimeToUdate(LocalTime localTime, LocalDate localDate) {
        LocalDateTime localDateTime = LocalDateTime.of(localDate, localTime);
        ZoneId zone = ZoneId.systemDefault();
        Instant instant = localDateTime.atZone(zone).toInstant();
        return Date.from(instant);
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章