java8-新的日期和时间API

在Java8之前对时间支持的库只有Date和Calender库。其中Date类中的很多方法都已经被废弃了,取而代之的是java.util.Calender类。然后Calender类仍然拥有Date类中的一些问题和设计缺陷。如,月份仍然是从0开始计算。为解决这些缺陷,Java8中提供了新的日期和时间API,如操纵、解析、打印输出日期-时间对象,使用不同的时区和年历。

 

1、LocalDate

 LocalDate是个不可变对象 ,只提供简单的日期(年-月-日),不附带任何与时区相关的信息

public final class LocalDate implements Temporal, TemporalAdjuster, ChronoLocalDate, Serializable

可以通过静态工厂方法of()创建一个LocalDate实例。

LocalDate date = LocalDate.of(2016, 3, 28);
//2016
int year = date.getYear();
//MARCH
Month month = date.getMonth();
//3
int monthValue = date.getMonthValue();
//28
int day = date.getDayOfMonth();
//该日是该年的多少天
int count = date.getDayOfYear();
//该日是该星期的多少天
int dayOfWeek = date.getDayOfWeek().getValue();
//是否闰年
boolean leap = date.isLeapYear();
//获取当前时间, (年月日)
LocalDate localDate = LocalDate.now();
//当前时间, 格式:yyyy-mm-dd
String dateStr = localDate.toString();
//格式化时间
LocalDate date = LocalDate.parse("2018-05-17");

使用TemporalField读取LocalDate的值

LocalDate localDate = LocalDate.of(2016, 3, 28);
int year = localDate.get(ChronoField.YEAR);
int month = localDate.get(ChronoField.MONTH_OF_YEAR);
int day = localDate.get(ChronoField.DAY_OF_MONTH);

2、LocalTime

LocalTime是一个不可变的日期时间对象, 用来表示时-分-秒-毫秒。

public final class LocalTime implements Temporal, TemporalAdjuster, Comparable<LocalTime>, Serializable

与LocalDate相同LocalTime也可以通过now()方法获取当前时间,通过of()创建一个不可变的时间

LocalTime localTime = LocalTime.now();
LocalTime time = LocalTime.of(17, 30, 25, 100);
//小时
int hour = time.getHour();
//分钟
int minute = time.getMinute();
//秒
int second = time.getSecond();
//毫秒
int nano = time.getNano();
//时间格式化
LocalTime time2 = LocalTime.parse("15:35:32.111");

3、LocalDateTime

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

LocalDateTime localDateTime1 = LocalDateTime.now();
LocalDateTime localDateTime2 = LocalDateTime.of(localDate, time);
LocalDateTime localDateTime3 = LocalDateTime.of(2017,5 , 25, 14, 15, 52);

可通过如下方式获取LocalDate和LocalTime

LocalDate date1 = localDateTime1.toLocalDate();
LocalTime time1 = localDateTime1.toLocalTime();

对时间进行更改

plus:以增加某个指定的时长的方式创建该 interval 的副本

System.out.println("当前时间:" + localDateTime1);
System.out.println("7天后:" + localDateTime1.plusDays(7));
System.out.println("1小时后:" + localDateTime1.plusHours(1));

minus:通过减去一定的时间创建该 interval 的副本

System.out.println("7天前:" + localDateTime1.minusDays(7));
System.out.println("1小时前:" + localDateTime1.minusHours(1));

with:设置一个固定的interval 副本

System.out.println("固定时间 18点:" + localDateTime1.withHour(18));
System.out.println("固定时间 10分:" + localDateTime1.withMinute(10));

获取String类型和Date类型的时间

//转换为String
localDateTime1.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
//转换为Date
Date.from(localDateTime1.atZone(ZoneId.systemDefault()).toInstant());
//Date转换LocalDateTime
LocalDateTime.ofInstant(new Date().toInstant(), ZoneId.systemDefault());

设置时区

//设置时区为东一区
localDateTime1.atZone(ZoneId.of("UTC-1"));

相比于Calender和Date,LocalDateTime比较时间更加容易

boolean isEquals = localDateTime1.equals(localDateTime1);
boolean isAfter = localDateTime1.isAfter(localDateTime2);
boolean isBefore = localDateTime1.isBefore(localDateTime2);

使用Period比较时间

Period.between()方法只能日期之间

LocalDateTimeUtils:日期帮助类

package time;

import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.Date;

/**
 * @ClassName : LocalDateTimeUtils
 * @Author : bianwc
 * @Date : 2019/8/15 15:37
 * @Description : TODO
 */
public class LocalDateTimeUtils {
    /**
     * date格式化为LoclDateTime
     * @param date
     * @return
     */
    public static LocalDateTime formateLocalDateTime(Date date) {
        return LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());
    }

    /**
     * LocalDateTime格式化为Date
     * @param localDateTime
     * @return
     */
    public static Date formateDate(LocalDateTime localDateTime) {
        return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
    }

    /**
     * 获取当前时间
     * @return
     */
    public static LocalDateTime getNow() {
        return LocalDateTime.now();
    }

    /**
     * 获取指定时间的指定格式
     * @param time
     * @param pattern
     * @return
     */
    public static String formatTime(LocalDateTime time, String pattern) {
        return time.format(DateTimeFormatter.ofPattern(pattern));
    }

    /**
     * 获取当前时间的指定格式
     * @param pattern
     * @return
     */
    public static String formatNow(String pattern) {
        return  formatTime(LocalDateTime.now(), pattern);
    }

    /**
     * 日期增加一个数  nuit决定增加的格式
     * @param time
     * @param number
     * @param unit
     * @return
     */
    public static LocalDateTime plus(LocalDateTime time, long number, ChronoUnit unit) {
        return time.plus(number, unit);
    }

    /**
     * 日期减少一个数
     * @param time
     * @param number
     * @param unit
     * @return
     */
    public static LocalDateTime minus(LocalDateTime time, long number, ChronoUnit unit) {
        return time.minus(number, unit);
    }

    /**
     * 两个日期的差值
     * @param startTime
     * @param endTime
     * @return
     */
    public static long between(LocalDateTime startTime, LocalDateTime endTime, ChronoUnit unit) {
        return unit.between(startTime, endTime);
    }

    /**
     * 检查两个日期是否相同
     * @param localDateTime1
     * @param localDateTime2
     * @return
     */
    public static boolean isEquals(LocalDateTime localDateTime1, LocalDateTime localDateTime2) {
        return localDateTime1.equals(localDateTime2);
    }

    /**
     * 日期1是否大于日期2
     * @param localDateTime1
     * @param localDateTime2
     * @return
     */
    public static boolean isAfter(LocalDateTime localDateTime1, LocalDateTime localDateTime2) {
        return localDateTime1.isAfter(localDateTime2);
    }

    /**
     * 日期1是否小于日期2
     * @param localDateTime1
     * @param localDateTime2
     * @return
     */
    public static boolean isBefore(LocalDateTime localDateTime1, LocalDateTime localDateTime2) {
        return localDateTime1.isBefore(localDateTime2);
    }

    /**
     * 获取日期的开始时间
     * @param localDateTime
     * @return
     */
    public static LocalDateTime getDayStart(LocalDateTime localDateTime) {
        return localDateTime.withHour(0)
                .withMinute(0)
                .withSecond(0)
                .withNano(0);
    }

    /**
     * 获取日期的结束时间
     * @param localDateTime
     * @return
     */
    public static LocalDateTime getDayEnd(LocalDateTime localDateTime) {
        return localDateTime.withHour(23)
                .withMinute(59)
                .withSecond(59)
                .withNano(999999999);
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值