死磕18个Java8日期处理,工作必用!

链接:http://suo.im/5RJhaU

Java 8 推出了全新的日期时间API,在教程中我们将通过一些简单的实例来学习如何使用新API。

Java处理日期、日历和时间的方式一直为社区所诟病,将 java.util.Date设定为可变类型,以及SimpleDateFormat的非线程安全使其应用非常受限。

新API基于ISO标准日历系统,java.time包下的所有类都是不可变类型而且线程安全。


示例1:Java 8中获取今天的日期

Java 8 中的 LocalDate 用于表示当天日期。和java.util.Date不同,它只有日期,不包含时间。当你仅需要表示日期时就用这个类。

package com.shxt.demo02;

import java.time.LocalDate;

public class Demo01 {    public static void main(String[] args) {        LocalDate today = LocalDate.now();        System.out.println('今天的日期:'+today);    }}


示例2:Java 8中获取年、月、日信息

package com.shxt.demo02;

import java.time.LocalDate;

public class Demo02 {
    public static void main(String[] args) {
        LocalDate today = LocalDate.now();
        int year = today.getYear();
        int month = today.getMonthValue();
        int day = today.getDayOfMonth();

System.out.println('year:'+year);
        System.out.println('month:'+month);
        System.out.println('day:'+day);

}
}


示例3:Java 8中处理特定日期

我们通过静态工厂方法now()非常容易地创建了当天日期,你还可以调用另一个有用的工厂方法LocalDate.of()创建任意日期, 该方法需要传入年、月、日做参数,返回对应的LocalDate实例。这个方法的好处是没再犯老API的设计错误,比如年度起始于1900,月份是从0开 始等等。

package com.shxt.demo02;

import java.time.LocalDate;

public class Demo03 {    public static void main(String[] args) {        LocalDate date = LocalDate.of(2018,2,6);        System.out.println('自定义日期:'+date);    }}


示例4:Java 8中判断两个日期是否相等

package com.shxt.demo02;

import java.time.LocalDate;

public class Demo04 {
    public static void main(String[] args) {
        LocalDate date1 = LocalDate.now();

LocalDate date2 = LocalDate.of(2018,2,5);

if(date1.equals(date2)){
            System.out.println('时间相等');
        }else{
            System.out.println('时间不等');
        }

}
}


示例5:Java 8中检查像生日这种周期性事件

package com.shxt.demo02;

import java.time.LocalDate;import java.time.MonthDay;

public class Demo05 {    public static void main(String[] args) {        LocalDate date1 = LocalDate.now();

        LocalDate date2 = LocalDate.of(2018,2,6);        MonthDay birthday = MonthDay.of(date2.getMonth(),date2.getDayOfMonth());        MonthDay currentMonthDay = MonthDay.from(date1);

        if(currentMonthDay.equals(birthday)){            System.out.println('是你的生日');        }else{            System.out.println('你的生日还没有到');        }

    }}

只要当天的日期和生日匹配,无论是哪一年都会打印出祝贺信息。你可以把程序整合进系统时钟,看看生日时是否会受到提醒,或者写一个单元测试来检测代码是否运行正确。

示例6:Java 8中获取当前时间

package com.shxt.demo02;

import java.time.LocalTime;

public class Demo06 {
    public static void main(String[] args) {
        LocalTime time = LocalTime.now();
        System.out.println('获取当前的时间,不含有日期:'+time);

}
}

可以看到当前时间就只包含时间信息,没有日期

示例7:Java 8中获取当前时间

通过增加小时、分、秒来计算将来的时间很常见。Java 8除了不变类型和线程安全的好处之外,还提供了更好的plusHours()方法替换add(),并且是兼容的。注意,这些方法返回一个全新的LocalTime实例,由于其不可变性,返回后一定要用变量赋值。

package com.shxt.demo02;

import java.time.LocalTime;

public class Demo07 {    public static void main(String[] args) {        LocalTime time = LocalTime.now();        LocalTime newTime = time.plusHours(3);        System.out.println('三个小时后的时间为:'+newTime);

    }}


示例8:Java 8如何计算一周后的日期

和上个例子计算3小时以后的时间类似,这个例子会计算一周后的日期。LocalDate日期不包含时间信息,它的plus()方法用来增加天、周、月,ChronoUnit类声明了这些时间单位。由于LocalDate也是不变类型,返回后一定要用变量赋值。

package com.shxt.demo02;

import java.time.LocalDate;
import java.time.temporal.ChronoUnit;

public class Demo08 {
    public static void main(String[] args) {
        LocalDate today = LocalDate.now();
        System.out.println('今天的日期为:'+today);
        LocalDate nextWeek = today.plus(1, ChronoUnit.WEEKS);
        System.out.println('一周后的日期为:'+nextWeek);

}
}

可以看到新日期离当天日期是7天,也就是一周。你可以用同样的方法增加1个月、1年、1小时、1分钟甚至一个世纪,更多选项可以查看Java 8 API中的ChronoUnit类

示例9:Java 8计算一年前或一年后的日期

利用minus()方法计算一年前的日期

package com.shxt.demo02;

import java.time.LocalDate;import java.time.temporal.ChronoUnit;

public class Demo09 {    public static void main(String[] args) {        LocalDate today = LocalDate.now();

        LocalDate previousYear = today.minus(1, ChronoUnit.YEARS);        System.out.println('一年前的日期 : ' + previousYear);

        LocalDate nextYear = today.plus(1, ChronoUnit.YEARS);        System.out.println('一年后的日期:'+nextYear);

    }}


示例10:Java 8的Clock时钟类

Java 8增加了一个Clock时钟类用于获取当时的时间戳,或当前时区下的日期时间信息。以前用到System.currentTimeInMillis()和TimeZone.getDefault()的地方都可用Clock替换。

package com.shxt.demo02;

import java.time.Clock;

public class Demo10 {
    public static void main(String[] args) {
        // Returns the current time based on your system clock and set to UTC.
        Clock clock = Clock.systemUTC();
        System.out.println('Clock : ' + clock.millis());

// Returns time based on system clock zone
        Clock defaultClock = Clock.systemDefaultZone();
        System.out.println('Clock : ' + defaultClock.millis());

}
}


示例11:如何用Java判断日期是早于还是晚于另一个日期

另一个工作中常见的操作就是如何判断给定的一个日期是大于某天还是小于某天?在Java 8中,LocalDate类有两类方法isBefore()和isAfter()用于比较日期。调用isBefore()方法时,如果给定日期小于当前日期则返回true。

package com.shxt.demo02;

import java.time.LocalDate;import java.time.temporal.ChronoUnit;

public class Demo11 {    public static void main(String[] args) {        LocalDate today = LocalDate.now();

        LocalDate tomorrow = LocalDate.of(2018,2,6);        if(tomorrow.isAfter(today)){            System.out.println('之后的日期:'+tomorrow);        }

        LocalDate yesterday = today.minus(1, ChronoUnit.DAYS);        if(yesterday.isBefore(today)){            System.out.println('之前的日期:'+yesterday);        }    }}


示例12:Java 8中处理时区

Java 8不仅分离了日期和时间,也把时区分离出来了。现在有一系列单独的类如ZoneId来处理特定时区,ZoneDateTime类来表示某时区下的时间。这在Java 8以前都是 GregorianCalendar类来做的。下面这个例子展示了如何把本时区的时间转换成另一个时区的时间。

package com.shxt.demo02;

import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;

public class Demo12 {
    public static void main(String[] args) {
        // Date and time with timezone in Java 8
        ZoneId america = ZoneId.of('America/New_York');
        LocalDateTime localtDateAndTime = LocalDateTime.now();
        ZonedDateTime dateAndTimeInNewYork  = ZonedDateTime.of(localtDateAndTime, america );
        System.out.println('Current date and time in a particular timezone : ' + dateAndTimeInNewYork);
    }
}

(0)

相关推荐

  • Java基础之:日期类

    Java基础之:日期类 第一代日期类 Date:精确到毫秒,代表特定的瞬间 SimpleDateFormat:格式和解析日期的类 SimpleDateFormat 是一个以与语言环境有关的方式来格式化 ...

  • 《山海情》现实版“马得福”?死磕18年荒漠变绿洲,种出了有机枸杞!

    突然开始刷屏以扶贫为主旋律的<山海情>,全民口碑极佳,不论男女老少,都大赞它的真实和动人,称得上是今年最"接地气"的好剧! 探究其大火的原因,无非是够真实.打动人,整个 ...

  • 小学六年死磕这18道应用题,数学次次考满...

    小学六年死磕这18道应用题,数学次次考满分 想考好数学,最重要的就是多练题 大多数题型都差不多,就是举一反三的问题 今天老师准备了小学必考的18种应用题 死磕这些,然后举一反三 数学保证次次得高分 . ...

  • 与才叔死磕《金匮要略》18

    医 说实在的,我自己并不怎么喜欢医古文,对于医古文翻译这类事情也没多大兴趣,那你会说,既然如此,才叔你为什么做中医?诶,做中医是偶然的,我想中医学院的学生多数有此体会.不过,既来之则安之,于是便决定在 ...

  • 18部影片定档端午档!彭于晏郑恺黄轩邱泽死磕姐妹淘

    今年端午档,目前为止,已经定档的影片高达20多部,包括3部进口片,15部国产片,涵盖喜剧.青春.爱情.惊悚.爱情.运动.动画多种类型题材. 目前,<你好世界><比得兔2>< ...

  • 中国沸腾!再捐100亿,那个“死磕玻璃”的土老头,疯了!

    我是甜瓜. 5月,一个喜讯传遍了中国福建. 高新区南屿镇,旗山南麓,闽江西岸, 这里毗邻福州大学城,是一座省级历史文化名镇,素有福州"小中亭"之称. 福建人曹德旺,正式宣布:出资1 ...

  • 中考数学备考 | 死磕这27张图,数学考试次次都能拿高分!(建议收藏)

    专业的初中数学学习平台 每天17:00不见不散 今天颜老师分享的是一位中考数学满分学霸的学习秘笈! 他就把这27张图放在最显眼的位置,把这些熟记在心,考试想考不好都难!替孩子打印一份吧! (点击可查看 ...

  • 接下来,死磕这一板块!

    今天回上海,买的高铁票是下午接近三点的,我人已经到了车站,于是这段时间成了一个寂寞时间,我决定写字打发时间了. 五一假期后两个交易日,市场重挫.与之对比鲜明的是美股又新高了.人比人气死人,股市比股市也 ...

  • 此国与中国死磕700年,被并入后,中国一下子多了100个县

    导语:探究历史的真相,挖掘过去的故事,听老一辈讲述脚下土地曾经发生的故事,感受历史传达的厚重,用全新的角度去观察历史,用心去聆听来自过去的声音,感受古人传达的智慧,用更加科学的方式去讲述古代人的故事, ...

  • 我的青春 | 死磕出来的强悍人生

    (原载<辽宁青年>202009期) 高考结束后,沈阳市法库县考生王唯佳并没有闲下来.每天上午8点,他弯着腰慢慢走到自家的仓库,免费给8名村里的学生辅导功课.但因使不上劲.直不起腰,每天的辅 ...