Java8 的日期操作

罗列一下java8中对于日期的一些Api,以便在以后工作或练习中使用。
使用的是LocalDatelocalTimeLocalDateTime这三个类对日期进行操作。
需要注意的是LocalDateLocalTimeLocalDateTime是和String对象一样的,被final修饰,是不可变的。在对LocalDateLocalTime进行操作后需要使用新的LocalDateLocalTimeLocalDateTime去接收日期处理之后的返回值

package com.mywork.test;

import org.junit.Test;

import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.Date;

/**
 * Java8日期处理
 */
public class Java8Date {
    /**
     * 获取今天的日期
     * LocalDate输出的日期格式为:yyyy-MM-dd
     */
    @Test
    public void getTodayTime(){
        LocalDate today = LocalDate.now();
        System.out.println("今天的日期:"+today);
    }

    /**
     * 获取当前日期归属的年、月、日
     */
    @Test
    public void getYearMonthDay(){
        LocalDate today = LocalDate.now();
        System.out.println("今天归属的年份:"+today.getYear());
        System.out.println("今天归属的月份: "+today.getMonth());
        System.out.println("今天归属几号: "+today.getDayOfMonth());
    }

    /**
     * 自定义创建日期
     */
    @Test
    public void initDate(){
        LocalDate day = LocalDate.of(2018,3,3);
        System.out.println("自定义初始化的日期: "+day);
    }

    /**
     * 判断日期是否相等
     */
    @Test
    public void equalsDay(){
        LocalDate date1 = LocalDate.now();
        LocalDate date2 = LocalDate.of(2018,3,3);
        System.out.println(date1.equals(date2));
    }

    /**
     * 判断是否是周期性的日期(例如每年的生日)
     */
    @Test
    public void isPeriodicDay(){
        LocalDate today = LocalDate.now();
        LocalDate target = LocalDate.of(2018,2,25);
        MonthDay monthDay = MonthDay.of(target.getMonth(),target.getDayOfMonth()); //获取源目标日期的月份和号
        MonthDay todayOfMonthDay = MonthDay.from(today); //获取到当前日期的月份和号
        System.out.println(monthDay.equals(todayOfMonthDay));
    }

    /**
     * 获取到当前时间(不含日期),精度超过毫秒级别
     */
    @Test
    public void getNowTime(){
        LocalTime nowTime = LocalTime.now();
        System.out.println(nowTime);
    }

    /**
     * 时间加减计算,使用ChronoUnit对象,里面有时、分、秒 的单位
     */
    @Test
    public void calculateTime(){
        LocalTime nowTime = LocalTime.now();
        System.out.println("3小时前的时间:"+nowTime.minus(3,ChronoUnit.HOURS));
        System.out.println("3小时后的时间:"+nowTime.plus(3,ChronoUnit.HOURS));
        System.out.println("3分钟前的时间:"+nowTime.minus(3,ChronoUnit.MINUTES));
        System.out.println("3秒前的时间:"+nowTime.minus(3,ChronoUnit.SECONDS));
    }

    /**
     *日期计算,使用ChronoUnit对象,里面有年、月、日、周的单位
     */
    @Test
    public void calculateDate(){
        LocalDate today = LocalDate.now();
        //使用负数计算以前的时间
        System.out.println("一周前的日期:"+today.plus(-1, ChronoUnit.WEEKS));
        System.out.println("一年前的日期:"+today.plus(-1, ChronoUnit.YEARS));
        System.out.println("一天前的日期:"+today.plus(-1, ChronoUnit.DAYS));
        System.out.println("一个月前的日期:"+today.plus(-1, ChronoUnit.MONTHS));
        System.out.println("一年后的日期:"+today.plus(1, ChronoUnit.YEARS));
        //使用minus方法计算以前的日期
        System.out.println("一年前的日期:"+today.minus(1,ChronoUnit.YEARS));
        System.out.println("一周前的日期:"+today.minus(1,ChronoUnit.WEEKS));
    }

    /**
     * 日期判断是否晚于/早于某个日期
     */
    @Test
    public void compareDay(){
        LocalDate day1 = LocalDate.now();   //当前的日期
        LocalDate day2 = LocalDate.of(2018,3,3); //2018年3月3日
        System.out.println(day1.isAfter(day2));     //给定的日期大于传入的日期,则返回true
        System.out.println(day2.isBefore(day1)); //给定日期小于传入的日期,则返回true
    }

    /**
     * 2月份特殊处理
     */
    @Test
    public void specialDay(){
        YearMonth thisYearMonth = YearMonth.now();  //当前年份
        System.out.println("当前年份的2月份有多少天:"+thisYearMonth.lengthOfMonth());
        YearMonth lastYearMonth = YearMonth.of(2020, Month.FEBRUARY);
        System.out.println("获取到2020年的2月份"+lastYearMonth);
    }

    /**
     * 检查闰年
     */
    @Test
    public void checkLeapYear(){
        LocalDate day1  = LocalDate.now();
        System.out.println("当前年份是否是闰年:"+day1.isLeapYear());
        LocalDate day2 = LocalDate.of(2020,3,3);
        System.out.println("2020年是否是闰年:"+day2.isLeapYear());
    }

    /**
     * 计算两个日期之间的天数、月数、年
     */
    @Test
    public void calculateDayOrMonthCount(){
        LocalDate day1 = LocalDate.now();
        LocalDate day2 = LocalDate.of(2018,3,3);
        System.out.println("当前日期和2018年3月3日相差天数:"+day2.until(day1,ChronoUnit.DAYS));
        //向下取整
        System.out.println("当前日期和2018年3月3日相差月数:"+day2.until(day1,ChronoUnit.MONTHS));
        //向下取整
        System.out.println("当前日期和2018年3月3日相差年数:"+day2.until(day1,ChronoUnit.YEARS));
    }

    /**
     * 获取当前时间戳
     */
    @Test
    public void getTimesStamp(){
        Instant instant = Instant.now();
        System.out.println("当前时间戳为:"+instant);
        //Date和Instant对象相互转化
        Date d = Date.from(instant);
        Date date =new Date();
        date.toInstant();
    }

    /**
     * 日期格式化
     */
    @Test
    public void formatting(){
        String s = "20180303";
        LocalDate day = LocalDate.parse(s, DateTimeFormatter.BASIC_ISO_DATE);
        System.out.println("格式化后的日期为:"+day);
    }

    /**
     * 字符串与LocalDate的相互转化
     *
     * 此处,不能使用LocalDate(如果转化的只是日期,不包含时间),因为LocalDate是不包含时间的
     * 也不能使用LocalTime(如果转化的只是时间),因为LocalTime是不包含日期的
     * LocalDateTime的格式形如:2018-03-03T00:00
     */
    @Test
    public void stringAndLocalDate(){
        //LocalDateTime转字符串
        LocalDateTime now = LocalDateTime.now();
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss"); //自定义日期格式
        String str = now.format(formatter);
        System.out.println("LocalDate转字符串:"+str);
        //字符串转LocalDateTime
        String dateStr = "2018年03月03日 00:00:00";        //这里的字符串日期格式,必须跟格式化的格式一致,否则会报错
        LocalDateTime day = LocalDateTime.parse(dateStr,formatter);
        System.out.println("字符串转LocalDateTime"+day);
    }

    /**
     * Date与LocalDate的相互转化
     *
     * 通过时间戳进行相互转化
     */
    @Test
    public void DateAndLocalDate(){
        //Date转LocalDate
        Date date = new Date();
        Instant instant = date.toInstant(); //Date转时间戳
        ZoneId zoneId = ZoneId.systemDefault(); //获取当前系统时区
        LocalDateTime localDateTime = LocalDateTime.ofInstant(instant,zoneId); //转成LocalDateTime
        LocalDate localDate = localDateTime.toLocalDate();
        System.out.println("Date转LocalDate: "+localDate);
        //LocalDate转Date
        LocalDate now = LocalDate.now();
        ZoneId zoneId1 = ZoneId.systemDefault();  //获取当前系统时区
        Instant instant1 = localDate.atStartOfDay(zoneId1).toInstant(); //转成时间戳
        Date date1 = Date.from(instant1);
        System.out.println("LocalDate转Date: "+date1);
    }

    /**
     * Date与LocalTime相互转化
     */
    @Test
    public void DateAndLocalTime(){
        //Date转LocalTime
        Date date = new Date();
        Instant instant = date.toInstant(); //Date转时间戳
        ZoneId zoneId = ZoneId.systemDefault(); //获取系统时区
        LocalDateTime localDateTime = LocalDateTime.ofInstant(instant,zoneId);  //先转成LocalDateTime
        LocalTime localTime = localDateTime.toLocalTime(); //LocalDateTime转成LocalTime
        System.out.println("Date转LocalTime: "+localTime);
        //LocalTime转Date
        LocalTime localTime1 = LocalTime.now();
        LocalDate localDate = LocalDate.now();
        LocalDateTime localDateTime1 = LocalDateTime.of(localDate,localTime1); //根据LocalDate和LocalTime转成LocalDateTime
        ZoneId zoneId1 = ZoneId.systemDefault(); //获取系统时区
        Instant instant1 = localDateTime1.atZone(zoneId1).toInstant(); //根据时区转成时间戳
        Date date1 = Date.from(instant1); //时间戳转Date
        System.out.println("LocalTime转Date: "+date1);
    }

    /**
     * Date与LocalDateTime相互转化
     */
    @Test
    public void DateAndLocalDateTime(){
        //Date转LocalTime
        Date date = new Date();
        Instant instant = date.toInstant(); //Date转时间戳
        ZoneId zoneId = ZoneId.systemDefault(); //获取系统时区
        LocalDateTime localDateTime = LocalDateTime.ofInstant(instant,zoneId);
        System.out.println("Date转LocalTime: "+localDateTime);
        //LocalTime转Date
        LocalDateTime localDateTime1 = LocalDateTime.now();
        Instant instant1 = localDateTime1.atZone(zoneId).toInstant();
        Date date1 = Date.from(instant1);
        System.out.println("LocalTime转Date: "+date1);
    }


}

日积月累,终有收获。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值