1.4 java8 LocalDate

一、概述

在JAVA中,常用的处理日期和时间的类主要有Date,Calendar,而在JDK1.8中,新增了LocalDate、LocalTime、LocalDateTime 类的实例是不可变的对象,分别表示使用 ISO-8601日历系统的日期、时间、日期和时间。它们提供了简单的日期或时间,并不包含当前的时间信息。也不包含与时区相关的信息。
注:ISO-8601日历系统是国际标准化组织制定的现代公民的日期和时间的表示法。

1. api

创建对象

2. Instant 时间戳

用于“时间戳”的运算。它是以Unix元年(传统的设定为UTC时区1970年1月1日午夜时分)开始所经历的描述进行运算。

Instant.now() // 2020-09-17T06:03:18.795Z
Instant.now().toEpochMilli() // 1600322598885
System.currentTimeMillis() // 1600322598885

3. Duration 和 Period

Duration:用于计算两个“时间”间隔

Period:用于计算两个“日期”间隔 

// 计算日期间隔
LocalDate startDate = LocalDate.of(2020, 9, 15);
LocalDate endDate = LocalDate.of(2020, 9, 20);
Period period = Period.between(startDate, endDate);
System.out.println("period = " + period.getDays()); // 5

// 计算时间间隔
Instant start = Instant.parse("2020-09-17T14:15:30.00Z");
Instant end = Instant.parse("2020-09-17T14:16:30.00Z");
Duration duration = Duration.between(start, end);
System.out.println("duration = " + duration.getSeconds()); // 60

4. 日期的操纵

TemporalAdjuster : 时间校正器。有时我们可能需要获取例如:将日期调整到“下个周日”等操作。

TemporalAdjusters : 该类通过静态方法提供了大量的常用 TemporalAdjuster 的实现。

示例:

LocalDateTime date = LocalDateTime.now();

//1.with
// 本月第一天
LocalDateTime firstday = date.with(TemporalAdjusters.firstDayOfMonth());
System.out.println("firstday = " + firstday);   // 2020-06-01T13:35:13.124

// 本月最后一天
LocalDateTime lastDay = date.with(TemporalAdjusters.lastDayOfMonth());
System.out.println("lastDay = " + lastDay);     // 2020-06-30T13:35:13.124

// 上个月最后一天
LocalDateTime next_lastday = date.with(TemporalAdjusters.lastDayOfMonth());
System.out.println("next_lastday = " + next_lastday);   //  2020-06-30T14:02:53.152

// 下个周日:
LocalDate nextSunday = LocalDate.now().with(TemporalAdjusters.next(DayOfWeek.SUNDAY));
System.out.println("nextSunday = " + nextSunday);   // 2020-06-28

//2.of
// 本月第一天
LocalDate now = LocalDate.now();
LocalDate firstday1 = LocalDate.of(now.getYear(), now.getMonth(), 1);
System.out.println("firstday1 = " + firstday1); // 2020-06-01

// 上个月第一天
LocalDate lastMonth = LocalDate.now().plusMonths(-1); // .minusMonths(1);
LocalDate next_firstday = LocalDate.of(lastMonth.getYear(), lastMonth.getMonth(), 1);
System.out.println("next_firstday = " + next_firstday); // 2020-05-01


// 处理时间
LocalTime time = LocalTime.now();
System.out.println("time = " + time);   // 13:44:17.929

//3.相差
// 计算两个日期相差的月份数long betweenMONTHS = ChronoUnit.MONTHS.between(beforeDate, afterDate);

 

 

5. 解析与格式化

java.time.format.DateTimeFormatter 类:该类提供了三种格式化方法:
预定义的标准格式
语言环境相关的格式
自定义的格式

6. 时区的处理

Java8 中加入了对时区的支持,带时区的时间为分别为:
ZonedDate、ZonedTime、ZonedDateTime
其中每个时区都对应着 ID,地区ID都为 “{区域}/{城市}”的格式
例如 :Asia/Shanghai 等
ZoneId:该类中包含了所有的时区信息
getAvailableZoneIds() : 可以获取所有时区时区信息
of(id) : 用指定的时区信息获取 ZoneId 对象

7. 与传统日期处理的转换

示例:

public static Date localDateToDate(LocalDate localDate) {
    if(localDate == null) {
        return null;
    }
    ZonedDateTime zonedDateTime = localDate.atStartOfDay(ZoneId.systemDefault());
    return Date.from(zonedDateTime.toInstant());
}

public static LocalDate dateToLocalDate(Date date) {
    if(date == null) {
        return null;
    }
    return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
}

/**
 * 获取下个月第一天
 * @return
 */
public static Date getFirstDateOfNextMonth() {
    LocalDate localDate = LocalDate.now().plusMonths(1).with(TemporalAdjusters.firstDayOfMonth());
    return localDateToDate(localDate);
} 

 

参考:

java8 LocalDate,LocalDateTime中的方法

posted @ 2020-06-22 13:42  一帘幽梦&nn  阅读(315)  评论(0编辑  收藏  举报
点击查看具体代码内容