您当前的位置: 首页 >  小志的博客 Java

Java8日期时间新特性简单示例

小志的博客 发布时间:2020-05-15 22:37:31 ,浏览量:3

文章目录

    • 一、简介
    • 二、关键类
    • 三、简单示例
    • 四、全部代码
    • 六、Java 8日期时间API的重点总结

一、简介

  • java.util.Date 设定为可变类型,以及 SimpleDateFormat 的非线程安全使其应用非常受限
  • Java 8 全新的日期时间API基于ISO标准日历系统,java.time包下的所有类都是不可变类型而且线程安全。
  • Java 8 全新的日期时间API明确了日期时间概念,例如: 瞬时(instant)、 长短(duration)、 日期、 时间、 时区和 周期。

二、关键类

  • Instant:瞬时实例。
  • LocalDate:本地日期,不包含具体时间 例如:2014-01-14 可以用来记录生日、纪念日、加盟日等。
  • LocalTime:本地时间,不包含日期。
  • LocalDateTime:组合了日期和时间,但不包含时差和时区信息。
  • ZonedDateTime:最完整的日期时间,包含时区和相对UTC或格林威治的时差。

三、简单示例

1. 获取当前的日期

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

上面的代码创建了当天的日期,不含时间信息。打印出的日期格式非常友好,不像 Date类 打印出一堆没有格式化的信息。

2.、获取年、月、日信息

LocalDate 提供了获取年、月、日的快捷方法,其实例还包含很多其它的日期属性。通过调用这些方法就可以很方便的得到需要的日期信息,不用像以前一样需要依赖java.util.Calendar类了。


3、处理特定日期

静态工厂方法now()非常容易地创建了当天日期。
工厂方法 LocalDate.of() 创建任意日期, 该方法需要传入年、月、日做参数,返回对应的LocalDate实例。



4、判断两个日期是否相等

LocalDate 重载了equal方法。如果比较的日期是字符型的,需要先解析成日期对象再作判断。


5、检查像生日这种周期性事件

MonthDay类。这个类组合了月份和日,去掉了年,这意味着你可以用它判断每年都会发生事件。
和MonthDay类相似的还有一个 YearMonth类。这些类也都是不可变并且线程安全的值类型。


6、获取当前时间

获取时间使用的是 LocalTime 类,调用静态工厂方法now()来获取当前时间。默认的格式是 hh:mm:ss:nnn。



7、在现有的时间上增加小时

Java 8 提供了更好的 plusHours() 方法替换 add() ,并且是兼容的。注意,这些方法返回一个全新的LocalTime实例,由于其不可变性,返回后一定要用变量赋值。


8、计算一年、一个月、一周、一天后的日期

LocalDate日期不包含时间信息,它的plus()方法用来增加天、周、月,
ChronoUnit类声明了这些时间单位。可以用同样的方法增加1个月、1年、1小时、1分钟。


9、计算一年、一个月、一周、一天前的日期

通过 LocalDate 的 plus() 方法增加天数、周数或月数,这个例子我们利用 minus() 方法减少天数、周数或月数。


10、使用Java 8的Clock时钟类

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

11、判断日期是早于还是晚于另一个日期

LocalDate 类有两类方法 isBefore() 和 isAfter() 用于比较日期。调用 isBefore() 方法时,如果给定日期小于当前日期则返回 true。

12、处理时区

Java 8不仅分离了日期和时间,也把时区分离出来了。现在有一系列单独的类如 ZoneId 来处理特定时区,ZoneDateTime 类来表示某时区下的时间。

13、如何体现出固定日期

YearMonth 用于表示信用卡到期日、FD到期日、期货期权到期日等。
还可以用这个类得到 当月共有多少天,YearMonth 实例的 lengthOfMonth() 方法可以返回当月的天数,在判断2月有28天还是29天时非常有用。

14、检查闰年

LocalDate类有的方法 isLeapYear() 判断该实例是否是一个闰年

15、计算两个日期之间的天数和月数

有一个常见日期操作是计算两个日期之间的天数、周数或月数。在Java 8中可以用java.time.Period类来做计算。

16、获取当前的时间戳

Instant类有一个静态工厂方法now()会返回当前的时间戳。



17、使用预定义的格式化工具去解析或格式化日期

Java 8引入了全新的日期时间格式工具,线程安全而且使用方便。如下例子中使用了BASICISODATE格式化工具将2020年5月15日格式化成20200515。

四、全部代码

package com.rf.localdate;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.Date;

/**
 * @description:
 * @author: xiaozhi
 * @create: 2020-05-15 20:39
 */
public class Test {
    public static void main(String[] args) {
       // getCurrentDate();
        //getYearMonthDayDate();
        //handleSpecilDate();
        //compareDate();
        //cycleDate();
        //getCurrentTime();
        //plusHours();
        //nextDate();
        //previousDate();
        //clock();
        //isBeforeOrIsAfter();
        //getZoneTime();
        //checkCardExpiry();
        //isLeapYear();
        //calcDateDays();
        //getTimestamp();
        formateDate();
    }

    //获取当前日期
    public static void getCurrentDate(){
        LocalDate localDate = LocalDate.now();
        System.out.println("当前日期:"+localDate);

        //作为对比
        Date date = new Date();
        System.out.println(date);
    }
    //获取年、月、日信息
    public static void getYearMonthDayDate(){
        LocalDate localDate = LocalDate.now();
        int year = localDate.getYear();
        int month = localDate.getMonthValue();
        int day = localDate.getDayOfMonth();
        System.out.println("年:"+year+",月:"+month+",日:"+day);
    }
    //处理特定日期
    public static void handleSpecilDate(){
        LocalDate localDate=LocalDate.of(2020,5,15);
        System.out.println("特定日期: " + localDate);
    }

    //判断两个日期是否相等
    public static void compareDate(){
        LocalDate now = LocalDate.now();
        LocalDate date = LocalDate.of(2020, 5, 15);
        if(now.equals(date)){
            System.out.println("now和date的日期相等");
        }else{
            System.out.println("now和date的日期不相等");
        }
    }
    //处理周期性的日期
    public static void cycleDate(){
        LocalDate today = LocalDate.now();
        LocalDate dateOfBirth = LocalDate.of(2020, 05, 15);
        MonthDay birthday = MonthDay.of(dateOfBirth.getMonth(), dateOfBirth.getDayOfMonth());
        MonthDay currentMonthDay = MonthDay.from(today);
        if(currentMonthDay.equals(birthday)){
            System.out.println("祝你生日快乐");
        }else{
            System.out.println("今天不是你的生日");
        }
    }
    //获取当前时间
    public static void getCurrentTime(){
        LocalTime localTime = LocalTime.now();
        System.out.println("当前时间=" + localTime);

    }

    //增加小时
    public static void plusHours(){
        LocalTime time = LocalTime.now();
        LocalTime newTime = time.plusHours(1); // 增加1小时
        System.out.println("当前时间="+time);
        System.out.println("当前时间基础上增加1小时= " +  newTime);

    }

    //计算一年、一个月、一周、一天后的日期
    public static void nextDate(){
        LocalDate today = LocalDate.now();
        LocalDate nextYear = today.plus(1, ChronoUnit.YEARS);    //使用变量赋值
        LocalDate nextMonth = today.plus(1, ChronoUnit.MONTHS);    //使用变量赋值
        LocalDate nextWeek = today.plus(1, ChronoUnit.WEEKS);    //使用变量赋值
        LocalDate nextDay = today.plus(1, ChronoUnit.DAYS);    //使用变量赋值

        System.out.println("当前时间= " + today);
        System.out.println("一年之后的时间= " + nextYear);
        System.out.println("一个月之后的时间= " + nextMonth);
        System.out.println("一周之后的时间= " + nextWeek);
        System.out.println("一天之后的时间= " + nextDay);
    }
    //计算一年、一个月、一周、一天前的日期
    public static void previousDate(){
        LocalDate today = LocalDate.now();
        LocalDate previousYear = today.minus(1, ChronoUnit.YEARS);
        LocalDate previousMonth = today.minus(1, ChronoUnit.MONTHS);
        LocalDate previousWeeks = today.minus(1, ChronoUnit.WEEKS);
        LocalDate previousDay = today.minus(1, ChronoUnit.DAYS);
        System.out.println("当前时间= " + today);
        System.out.println("一年之前的时间= " + previousYear);
        System.out.println("一个月之前的时间= " + previousMonth);
        System.out.println("一周之前的时间= " + previousWeeks);
        System.out.println("一天之前的时间= " + previousDay);

    }
    //时钟类
    public static void clock(){
        // 根据系统时间返回当前时间并设置为UTC。
        Clock clock = Clock.systemUTC();
        System.out.println(clock);

        // 根据系统时钟区域返回时间
        Clock defaultClock = Clock.systemDefaultZone();
        System.out.println(defaultClock);

    }
    //java判断日期是早于还是晚于另一个日期
    public static void isBeforeOrIsAfter(){
        LocalDate today = LocalDate.now();
        System.out.println("当前日期="+today);
        LocalDate tomorrow = LocalDate.of(2020, 5, 16);
        System.out.println("明天日期="+tomorrow);
        if(tomorrow.isAfter(today)){
            System.out.println("明天是在今天之后");
        }
        //减去一天
        LocalDate yesterday = today.minus(1, ChronoUnit.DAYS);
        System.out.println("昨天日期="+yesterday);
        if(yesterday.isBefore(today)){
            System.out.println("昨天是在今天之前");
        }
    }


    //获取特定时区下面的时间
    public static void getZoneTime(){
        //设置时区
        ZoneId asia = ZoneId.of("Asia/Shanghai");
        System.out.println("当前时区="+asia);

        //设置当前日期和时间
        LocalDateTime localtDateAndTime = LocalDateTime.now();
        System.out.println("当前日期和时间="+localtDateAndTime);

        ZonedDateTime dateAndTimeInNewYork  = ZonedDateTime.of(localtDateAndTime, asia);
        System.out.println("现在的日期和时间在特定的时区 =" + dateAndTimeInNewYork);
    }

    //使用 YearMonth类处理特定的日期
    public static void checkCardExpiry(){
        YearMonth currentYearMonth = YearMonth.now();
        System.out.println("当前年份和月份="+currentYearMonth);
        System.out.println("当前月份有多少天="+currentYearMonth.lengthOfMonth());
        YearMonth creditCardExpiry = YearMonth.of(2025, Month.JUNE);
        System.out.println("指定你的信用卡到期时间="+creditCardExpiry);

    }

    //检查闰年
    public static void isLeapYear(){
        LocalDate today = LocalDate.now();
        System.out.println("当前日期="+today);
        if(today.isLeapYear()){
            System.out.println("2020年是闰年");
        }else {
            System.out.println("2020年不是是闰年");
        }
    }

    //计算两个日期之间的天数和月数
    public static void calcDateDays(){
        LocalDate today = LocalDate.now();
        System.out.println("当前日期="+today);
        LocalDate localDate = LocalDate.of(2020, Month.JULY, 25);
        System.out.println("指定的日期="+localDate);

        Period periodDate = Period.between(today, localDate);
        System.out.println("日期相差的年数= " + periodDate.getYears() );
        System.out.println("日期相差的月数= " + periodDate.getMonths() );
        System.out.println("日期相差的天数= " + periodDate.getDays() );
    }
    //获取当前的时间戳
    public static void getTimestamp(){
        Instant timestamp = Instant.now();
        System.out.println("当前的时间戳= " + timestamp);
    }

    // 使用预定义的格式化工具去解析或格式化日期
    public static void formateDate(){
        String dayAfterTommorrow = "20200515";
        LocalDate formatted = LocalDate.parse(dayAfterTommorrow, DateTimeFormatter.BASIC_ISO_DATE);
        System.out.print("格式化后的日期="+formatted);
    }

}

六、Java 8日期时间API的重点总结

  • 提供了javax.time.ZoneId 获取时区。
  • 提供了LocalDate和LocalTime类。
  • Java 8 的所有日期和时间API都是不可变类并且线程安全,而现有的Date和Calendar API中的java.util.Date和SimpleDateFormat是非线程安全的。
  • 主包是 java.time,包含了表示日期、时间、时间间隔的一些类。里面有两个子包java.time.format用于格式化, java.time.temporal用于更底层的操作。
  • 时区代表了地球上某个区域内普遍使用的标准时间。每个时区都有一个代号,格式通常由区域/城市构成(Asia/Tokyo),在加上与格林威治或 UTC的时差。例如:东京的时差是+09:00。
关注
打赏
查看更多评论

小志的博客

暂无认证

  • 3浏览

    0关注

    1100博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文
立即登录/注册

微信扫码登录