LocalDate LocalTime LocalDateTime DateTimeFormatter Java 8 新出的时间(time)和日期(date)的API的使用详细实例

现在有如下需求,根据传入时间
获得当前时间的凌晨零点零分零秒的时间,时间戳。
获得当前时间的本周一的凌晨零点零分零秒的时间,时间戳。
获得当前时间的本月的第一天的凌晨零点零分零秒的时间,时间戳。
新接口更好用的原因是考虑到了日期时间的操作,经常发生往前推或往后推几天的情况。
使用Java 8 新提供的API可以很好的操作时间。
时间和日期,可以实现简单的加plus 减 minus。可以操作的跨度:年月日时分秒周纳秒。
可谓相当的全。

还有个需要注意的地方,他有很多方法都是对当前日期操作完之后,返回一个新的日期,是不会改变原来的日期的,所以,操作完的结果,你得弄个新对象来接收哟

这三个类,都跟String类一样,是final的,不能修改和继承的。

先是一个总的main方法。

    /**
     * 在新的Java 8中,日期和时间被明确划分为LocalDate和LocalTime,
     * LocalDate无法包含时间;
     * LocalTime无法包含日期;
     * LocalDateTime才能同时包含日期和时间。
     */
    private static void java8DateTest() {
        localDateTest();
        localTimeTest();
        localDateTimeTest();
    }

LocalDate

    /**
     * jdk 1.8 中的 localDate 的使用
     */
    private static void localDateTest() {
        System.out.println("-----------test java 8 LocalDate-----------");
        LocalDate today = LocalDate.now();
        System.out.println("当前日期:" + today);
        System.out.println("当前日期的年:" + today.getYear());
        //返回的是枚举类型:Month,Java 8  新增的枚举类型
        System.out.println("当前日期的月--枚举类型:" + today.getMonth());
        //这个返回int才是我们常用的月的数字形式。
        //记得以前你学Java的时候,一月的数字是0吗?这不用你自己手动+1啦,自动就是月份对应的数字,1-12.
        System.out.println("当前日期的月--数字类型:" + today.getMonthValue());
        System.out.println("当前日期的日:" + today.getDayOfMonth());
        //返回的是枚举类型:DayOfWeek,Java 8 新增的枚举类型
        System.out.println("当前日期是周几:" + today.getDayOfWeek());
        System.out.println("当前日期是一年之中的第几天:" + today.getDayOfYear());
        //Chronology:翻译为年代学;年表。此处的返回值是 ISO
        System.out.println("年表:" + today.getChronology());

        LocalDate christmas = LocalDate.of(2017, 12, 25);
        System.out.println("christmas:" + christmas);
        //严格按照ISO yyyy-MM-dd验证,02写成2都不行,当然也有一个重载方法允许自己定义格式
        LocalDate endOfDec = LocalDate.parse("2017-12-28");
        System.out.println("endOfDec:" + endOfDec);
        /*
         * 无效日期无法通过:DateTimeParseException: Invalid date
         */
        //LocalDate.parse("2017-02-29");

        System.out.println("当前日期:" + today);
        LocalDate firstDayOfMonth = today.with(TemporalAdjusters.firstDayOfMonth());
        System.out.println("当前日期所在的月的第一天:" + firstDayOfMonth);
        LocalDate lastDayOfThisMonth = today.with(TemporalAdjusters.lastDayOfMonth());
        System.out.println("当前日期所在的月的最后一天:" + lastDayOfThisMonth);
        LocalDate secondDayOfThisMonth = today.withDayOfMonth(2);
        System.out.println("当前日期所在的月的第二天:" + secondDayOfThisMonth);

        //对日期进行加减 plus minus
        System.out.println("当前日期plus一天:" + today.plusDays(1));
        System.out.println("当前日期minus一天:" + today.minusDays(1));
    }

下面是运行的结果的图。

就简单的看下运行结果。

LocalTime

    /**
     * jdk 1.8 中的 LocalTime 的使用
     */
    private static void localTimeTest() {
        System.out.println("-----------test java 8 LocalTime-----------");
        LocalTime now = LocalTime.now();
        System.out.println("当前时间" + now);
        System.out.println("当前时间:小时--" + now.getHour());
        System.out.println("当前时间:分钟--" + now.getMinute());
        System.out.println("当前时间:秒--" + now.getSecond());
        //纳秒,不是毫秒,是十亿分之一秒。
        System.out.println("当前时间:纳秒--" + now.getNano());
        //清除毫秒数,也就是说,你可以肆意设置时间的任意一个位置的值,使用withXXX()就可以啦。
        System.out.println("当前时间:清空纳秒--" + now.withNano(0));
        System.out.println("当前时间:挨个清零--" + now.withHour(0).withMinute(0).withSecond(0).withNano(0));
    }

运行结果如下。

LocalDateTime

    /**
     * jdk 1.8 中的 LocalDateTime 的使用
     */
    private static void localDateTimeTest() {
        System.out.println("-----------test java 8 LocalDateTime-----------");
        //当前时间,以秒为单位。
        long epochSecond = System.currentTimeMillis() / 1000L;
        //默认使用系统时区
        ZoneId zoneId = ZoneOffset.systemDefault();
        //之所以这么初始化,是因为根据传入的时间进行操作
        LocalDateTime localDateTime = LocalDateTime.ofInstant(Instant.ofEpochSecond(epochSecond), zoneId);
        //LocalDateTime.now();//也可以这么获得当前时间
        System.out.println("localDateTime 初始化值:" + localDateTime);
        System.out.println("getYear:" + localDateTime.getYear());
        //方法返回值类型特殊,是枚举类型:Month类型
        System.out.println("getMonth:" + localDateTime.getMonth());
        System.out.println("getDayOfMonth:" + localDateTime.getDayOfMonth());
        System.out.println("getHour:" + localDateTime.getHour());
        System.out.println("getMinute:" + localDateTime.getMinute());
        System.out.println("getSecond:" + localDateTime.getSecond());
        System.out.println("getNano:" + localDateTime.getNano());
        System.out.println("getDayOfWeek:" + localDateTime.getDayOfWeek());

        /*
         * 获得传入时间的某一天的凌晨零分零秒的秒数
         */
        long dayStart = localDateTime.withHour(0).withMinute(0).withSecond(0).atZone(zoneId).toEpochSecond();
        System.out.println("dayStart 时间戳,秒数:" + dayStart);
        /*
         * 获得传入时间的周一的凌晨零分零秒的秒数
         */
        localDateTime = LocalDateTime.of(2017, 12, 2, 0, 0, 0);
        System.out.println("localDateTime 设置当前值:" + localDateTime);
        System.out.println("getDayOfWeek:" + localDateTime.getDayOfWeek());
        System.out.println("getDayOfWeek 的 ordinal 值:" + localDateTime.getDayOfWeek().ordinal());
        LocalDateTime weekStart = localDateTime.minusDays(localDateTime.getDayOfWeek().ordinal()).withHour(0).withMinute(0).withSecond(0);
        System.out.println("weekStart:" + weekStart);
        /*
         * 获得传入时间的月份的第一天的凌晨零分零秒的秒数
         */
        long monthStart = localDateTime.with(TemporalAdjusters.firstDayOfMonth()).withHour(0).withMinute(0).withSecond(0).atZone(zoneId).toEpochSecond();
        System.out.println("monthStart 时间戳,秒数:" + monthStart);

        /*
         * 传入时间的年的第一天
         */
        LocalDateTime firstDayOfYear = localDateTime.with(TemporalAdjusters.firstDayOfYear());
        System.out.println("firstDayOfYear:" + firstDayOfYear);

        /*
         * 当前时间,往后推一周的时间。plus   加
         */
        LocalDateTime plusWeeks = localDateTime.plusWeeks(1);
        System.out.println("plus one week:" + plusWeeks);
        /*
         * 当前时间,向前推一周的时间。minus  减
         */
        LocalDateTime minusWeeks = localDateTime.minusWeeks(1);
        System.out.println("minus one week:" + minusWeeks);

        DateTimeFormatter sf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
        String startTime = "2016-11-13 23:59";
        localDateTime = LocalDateTime.parse(startTime, sf);
        System.out.println(localDateTime);
    }

代码运行结果,如下:

讲真,这代码里面的星期,和所有的月,都变成了对应的枚举类型,枚举类型的用法要是有的观众不知道的话,可以参考下面的链接。

怎么才算你懂枚举呢?比如,上面说的 ordinal 属性,你知道这个是啥。不知道的,可以看看下面的链接。

Java 枚举(enum) 详解7种常见的用法

上面已经有不少实例啦,当然,肯定不全面,比如,不同的日期操作,有很多的初始化方法,我这也就实验了几个,没有全部实验。也有很多的方法,我也就简单的使用了一部分,具体源码里面,还是有很多我这没使用到的。老铁顺道点进去看看源码,大概就了解啦。

我要是以后有啥补充呢,也会继续完善这个文章的。

DateTimeFormatter

顺道再来个日期格式化的问题,配套的使用Java 8 里面的东西。

    /**
     * 日期格式化测试
     */
    private static void dateTimeFormatterTest() {
        /*
         * 解析日期
         */
        String dateStr = "2016年10月25日";
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日");
        LocalDate date = LocalDate.parse(dateStr, formatter);
        System.out.println(date);

        /*
         * 日期转换为字符串
         */
        LocalDateTime now = LocalDateTime.now();
        System.out.println("未格式化时:" + now);
        //HH 和 hh 的差别:前者是24小时制,后者是12小时制。
        String formatString = "yyyy年MM月dd日 HH:mm:SS" +
                " 上下午标志 a" +
                " E" +
                " 一年中的第D天" +
                " 一月中的第F个星期" +
                " 一年中的第w个星期" +
                " 一月中的第W个星期";
        DateTimeFormatter format = DateTimeFormatter.ofPattern(formatString);
        System.out.println(now.format(format));
        format = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm a");
        System.out.println(now.format(format));
        format = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm a");
        System.out.println(now.format(format));
    }

运行结果:


暂时就这样

具体里面的特殊字母不懂啥意思的,参见下面的链接:

java 日期格式化-- SimpleDateFormat 的使用。字符串转日期,日期转字符串

嗯,也可以顺道回忆一下,以前是怎么格式化日期的。

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值