java8 时间与日期api的总结与实例

– 所有 java.time 对象都是不可变的。

– 一个瞬间(Instant)是时间上的一个点(与Date类似)

– 在java实际按中每天都是 86400秒 (即没有闰秒)

– 持续时间(Duration)是两个瞬间之间的时间

– LocalDateTime 没有时区信息

– TemporalAdjuster方法可以处理常用的日历计算,例如找到某个月的第一个星期二

– ZonedDateTime 是指定时区中的某一个时间点(类似于Gregorian Calendar)

– 当处理带时区的时间时,请使用时段(Period),而非Duration,以便将夏令谁的变化考虑在内

– 使用DateTimeFormatter来格式化和解析日期和时间

– Java日期和时间Api 规范要求Java使用如下时标”
+ 每天都有86400秒。
+ 每天正午与官方实际按准确匹配
+ 其他时间也要以一种精确定义的方式与其紧密匹配


– 它提供了javax.time.ZoneId用来处理时区。

– 它提供了LocalDate与LocalTime类

– Java 8中新的时间与日期API中的所有类都是不可变且线程安全的,这与之前的Date与Calendar API中的恰好相反,那里面像java.util.Date以及SimpleDateFormat这些关键的类都不是线程安全的。

– 新的时间与日期API中很重要的一点是它定义清楚了基本的时间与日期的概念,比方说,瞬时时间,持续时间,日期,时间,时区以及时间段。它们都是基于ISO日历体系的。

– 每个Java开发人员都应该至少了解这套新的API中的这五个类:

– Instant 它代表的是时间戳,比如2014-01-14T02:20:13.592Z,这可以从java.time.Clock类中获取,像这样: Instant current = Clock.system(ZoneId.of(“Asia/Tokyo”)).instant();

– LocalDate 它表示的是不带时间的日期,比如2014-01-14。它可以用来存储生日,周年纪念日,入职日期等。

– LocalTime – 它表示的是不带日期的时间

– LocalDateTime – 它包含了时间与日期,不过没有带时区的偏移量

– ZonedDateTime – 这是一个带时区的完整时间,它根据UTC/格林威治时间来进行时区调整

– 这个库的主包是java.time,里面包含了代表日期,时间,瞬时以及持续时间的类。它有两个子package,一个是java.time.foramt,这个是什么用途就很明显了,还有一个是java.time.temporal,它能从更低层面对各个字段进行访问。

– 时区指的是地球上共享同一标准时间的地区。每个时区都有一个唯一标识符,同时还有一个地区/城市(Asia/Tokyo)的格式以及从格林威治时间开始的一个偏移时间。比如说,东京的偏移时间就是+09:00。

– OffsetDateTime类实际上包含了LocalDateTime与ZoneOffset。它用来表示一个包含格林威治时间偏移量(+/-小时:分,比如+06:00或者 -08:00)的完整的日期(年月日)及时间(时分秒,纳秒)。

– DateTimeFormatter类用于在Java中进行日期的格式化与解析。与SimpleDateFormat不同,它是不可变且线程安全的,如果需要的话,可以赋值给一个静态变量。DateTimeFormatter类提供了许多预定义的格式器,你也可以自定义自己想要的格式。当然了,根据约定,它还有一个parse()方法是用于将字符串转换成日期的,如果转换期间出现任何错误,它会抛出DateTimeParseException异常。类似的,DateFormatter类也有一个用于格式化日期的format()方法,它出错的话则会抛出DateTimeException异常。

– 再说一句,“MMM d yyyy”与“MMm dd yyyy”这两个日期格式也略有不同,前者能识别出”Jan 2 2014″与”Jan 14 2014″这两个串,而后者如果传进来的是”Jan 2 2014″则会报错,因为它期望月份处传进来的是两个字符。为了解决这个问题,在天为个位数的情况下,你得在前面补0,比如”Jan 2 2014″应该改为”Jan 02 2014″。

/**
 * java8 新的时间和日期的API
 * Created by 何欣澄 on 2017/4/2 0002.
 */
public class DateAndTIme {
    public static void main(String[] args) {


        // 本地时间 LocalDate LocalTime
        // ---------例子------------
        // 在Java 8中获取当天的日期
        LocalDate today = LocalDate.now();
        System.out.println("Today's Local date : " + today);

        //在Java 8中获取当前的年月日
        int year = today.getYear();
        int month = today.getMonthValue();
        Month month1 = today.getMonth();
        int day = today.getDayOfMonth();
        int dayOfYear = today.getDayOfYear();
        System.out.println("Today in year"+dayOfYear);
        System.out.printf("Year : %d Month : %d day : %d \t %n", year, month, day);

        //在Java 8中获取某个特定的日期
        LocalDate dateOfBirth = LocalDate.of(1990, 8, 6);
        System.out.println("Your birthday is : " + dateOfBirth);

        //在Java 8中检查两个日期是否相等
        LocalDate date1 = LocalDate.of(2017, 3, 26);
        if (date1.equals(today)) {
            System.out.printf("Today %s and date1 %s are same date %n", today, date1);
        }

        //在Java 8中检查重复事件,比如说生日
        MonthDay birthday = MonthDay.of(dateOfBirth.getMonth(), dateOfBirth.getDayOfMonth());
        MonthDay currentMonthDay = MonthDay.from(today);
        if (currentMonthDay.equals(birthday)) {
            System.out.println("Many Many happy returns of the day !!");
        } else {
            System.out.println("Sorry, today is not your birthday");
        }

        //在Java 8中获取当前时间
        LocalTime time = LocalTime.now();
        System.out.println("local time now : " + time);

        //增加时间里面的小时数
        LocalTime newTime = time.plusHours(2); // 增加两个小时
        System.out.println("Time after 2 hours : " + newTime);

        //获取1周后的日期
        LocalDate nextWeek = today.plus(1, ChronoUnit.WEEKS);
        System.out.println("Today is : " + today);
        System.out.println("Date after 1 week : " + nextWeek);

        // 一年前后的日期
        LocalDate previousYear = today.minus(1, YEARS);// ChronoUnit.YEARS
        System.out.println("Date before 1 year : " + previousYear);
        LocalDate nextYear = today.plus(1, YEARS);
        System.out.println("Date after 1 year : " + nextYear);

        //Java 8中自带了一个Clock类,你可以用它来获取某个时区下当前的瞬时时间,日期或者时间。
        // 可以用Clock来替代System.currentTimeInMillis()

        // 在Java 8中使用时钟
        Clock clock = Clock.systemUTC();
        System.out.println("Clock : " + clock);
        Clock.systemDefaultZone();
        System.out.println("Clock : " + clock);

        //比较日期
        LocalDate tomorrow = LocalDate.of(2017, 3, 26);
        if (tomorrow.isAfter(today)) {
            System.out.println("Tomorrow comes after today");
        }
        LocalDate yesterday = today.minus(1, DAYS);
        if (yesterday.isBefore(today)) {
            System.out.println("Yesterday is day before today");
        }

        //在Java 8中处理不同的时区
        ZoneId america = ZoneId.of("America/New_York");
        LocalDateTime localDateAndTime = LocalDateTime.now();
        ZonedDateTime dateAndTimeInNewYork = ZonedDateTime.of(localDateAndTime, america);
        System.out.println("Current date and time in a particular timezone : " + dateAndTimeInNewYork);

        //表示固定的日期,比如信用卡过期时间
        YearMonth currentYearMonth = YearMonth.now();
        System.out.printf("Days in month year %s: %d%n", currentYearMonth, currentYearMonth.lengthOfMonth());
        YearMonth creditCardExpiry = YearMonth.of(2018, Month.FEBRUARY);
        System.out.printf("Your credit card expires on %s %n", creditCardExpiry);

        //检查闰年
        if(today.isLeapYear()){
            System.out.println("This year is Leap year");
        }else {
            System.out.println("2017 is not a Leap year");
        }

        // Instant 对象表示时间轴上的一个点
        // 元年 : 1970-1-1
        // Instant.MIN 10亿年前
        // Instant.MAX 10000000001231日
        Instant start = Instant.now();

        System.out.println(Instant.MIN);
        System.out.println(start);
        System.out.println(Instant.MAX);

        Instant end = Instant.now();

        Duration timeElapsed = Duration.between(start, end);
        long millis = timeElapsed.toMillis();
        System.out.println("经过时间" + millis + "ms");

        // api
        /*
        *  plus,minus    对当前Instant或者Duration 添加或减少一段时间
        *  plusNanos,plusMillis,plusSeconds,plusMinutes,plusHours,plusDays
        *  减法为 minusXxxx
        *
        * */
        // 与旧api 之间的转换
        Date date = Date.from(start);
        Instant instant = date.toInstant();

        //两个日期之间包含多少天,多少个月
        LocalDate java8Release1 = LocalDate.of(2016, Month.JULY, 15);
        LocalDate java8Release2 = LocalDate.of(2018, Month.JULY, 15);
        Period periodToNextJavaRelease1 = Period.between(today, java8Release1); // period 表示时间段
        Period periodToNextJavaRelease2 = Period.between(today, java8Release2); // period 表示时间段
        System.out.println("Months left between today and Java 8 release1 : " + periodToNextJavaRelease1.getMonths() );
        System.out.println("Months left between today and Java 8 release2 : " + periodToNextJavaRelease2.getMonths() );

        //在Java 8中使用预定义的格式器来对日期进行解析/格式化
        String dayAfterTomorrow = "20170326";
        LocalDate formatted = LocalDate.parse(dayAfterTomorrow, DateTimeFormatter.BASIC_ISO_DATE);
        System.out.printf("Date generated from String %s is %s %n", dayAfterTomorrow, formatted);

        //在Java中使用自定义的格式器来解析日期
        String goodFriday = "03 18 2016";
        try {
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM dd yyyy");
            LocalDate holiday = LocalDate.parse(goodFriday, formatter);
            System.out.printf("Successfully parsed String %s, date is %s%n", goodFriday, holiday);
        } catch (DateTimeParseException ex) {
            System.out.printf("%s is not parsable!%n", goodFriday);
            ex.printStackTrace();
        }

        //在Java 8中对日期进行格式化,转换成字符串
        LocalDateTime arrivalDate = LocalDateTime.now();
        try {
            DateTimeFormatter format = DateTimeFormatter.ofPattern("MMM dd yyyy hh:mm a");
            String landing = arrivalDate.format(format);
            System.out.printf("Arriving at : %s %n", landing);
        } catch (DateTimeException ex) {
            System.out.printf("%s can't be formatted!%n", arrivalDate);
            ex.printStackTrace();
        }

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值