• JAVA8学习——新的时间日期API&Java8总结


    JAVA8-时间日期API

    java8之前用过的时间日期类。

    Date

    Calendar

    SimpleDateFormat

    有很多致命的问题。

    1.没有时区概念

    2.计算麻烦,实现困难

    3.类是可变的,线程不安全

    之前都是用的这个公认的第三方插件来操作:JodaTime

    认识一下Joda

    http://joda.org/

    • Joda-Time 时间的转换

    • Joda-Money 钱币类型的转换

    • Joda-Beans JavaBean的转换

    • Joda-Convert 类型的转换

    • Joda-Collect 集合的操作

    • Joda-Primitive 针对于原生类型的集合

    了解JAVA8的时间插件的背景-Joda-Time。

    Joda - time

    public boolean isAfterPayDay(DateTime datetime) {
      if (datetime.getMonthOfYear() == 2) {   // February is month 2!!
        return datetime.getDayOfMonth() > 26;
      }
      return datetime.getDayOfMonth() > 28;
    }
    

    ... 自行查阅官网吧:http://joda.org/

    关于日期与时间:

    1. 格林威治标准时间(全球时间的基准)

    2. UTC时间(不带时区的标准时间) : 2010-12-1T11:22:33.567Z+8:00

    3. ISO8601

    4. 网络时区的概念(自行Google)

    Joda-Time的学习

    demo入门- 用起来简单,功能强大。(相对于原生API )

    package com.dawa.jdk8.joda;
    
    import org.joda.time.DateTime;
    import org.joda.time.LocalDate;
    
    public class JodaTimeTest {
        public static void main(String[] args) {
            //java.util.time , 原来的时间对象是可变的. - 线程不安全
            //使用joda提供的DateTime
            DateTime today = new DateTime();
            DateTime tomorrow = today.plusDays(3); // 当前日期加三天
    
            System.out.println(today.toString("yyyy-MM-dd"));
            System.out.println(tomorrow.toString("yyyy-MM-dd"));
    
            System.out.println("------");
            //修改月中的天
            DateTime time = today.withDayOfMonth(1);
    
            //当前时区的时间
            LocalDate localDate = new LocalDate();
            System.out.println(localDate);
            System.out.println("------");
    
            //获取某个时间的某个月的最大的一天.
            LocalDate localDate1 = localDate.plusMonths(3);//当前日期加三个月
            System.out.println(localDate1);
            System.out.println("------");
            LocalDate.Property property = localDate1.dayOfMonth();
            System.out.println(property);
            LocalDate localDate2 = property.withMaximumValue();//这个月的最大天数
            System.out.println(localDate2);
            System.out.println("------");
    
            //计算两年前的第三月最后一天的日期
            DateTime dateTime = new DateTime();
            DateTime dateTime1 = dateTime.minusYears(2).
                    monthOfYear().setCopy(3).
                    dayOfMonth().withMaximumValue();
            System.out.println(dateTime1);
        }
    }
    
    

    查阅API会用,能满足你的功能性需求就OK了。

    Java Date 和 joda Time 是可以相互转换的。

    新的demo-通过简单的Demo对其有一个新的认识。

    
    public class JodaTimeTest3 {
        //标准UTC的时间: 2014-11-04-T09:22:52
        //给定一个UTC标准时间的字符串,转换成Date类型
        //由服务器来决定时间
        public static Date convertUTC2Date(String utcDate){
            try {
                DateTime parse = DateTime.parse(utcDate, DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ"));
                return parse.toDate();
            } catch (Exception e) {
                return null;
            }
        }
    
        //传输的时候,使用绝对的UTC格式时间字符串. 由客户端决定如何呈现.
        //客户在哪个时区,时间就是哪个时区的时间.
        public static String convertDate2UTC(Date javaDate) {
            DateTime dateTime = new DateTime(javaDate, DateTimeZone.UTC);
            return dateTime.toString();
        }
    
        public static String covertDate2LocalByDateFormat(Date date, String dateFormat) {
            DateTime dateTime = new DateTime(date);
            return dateTime.toString(dateFormat);
        }
    
        //所以:用标准的UTC时间来存储日期的话,是不会受时区影响的
        public static void main(String[] args) {
            System.out.println(JodaTimeTest3.convertUTC2Date("2019-11-04T09:22:54.876Z"));//结果会受影响
            System.out.println(JodaTimeTest3.convertDate2UTC(new Date())); //返回标准的UTC时间.
            System.out.println(JodaTimeTest3.covertDate2LocalByDateFormat(new Date(),"yyyy-MM-dd"));
        }
    }
    
    

    JAVA8-新的时间日期API

    Java8的所有的日期和API都是不可变的:确保线程的安全

    之前的API对象,都是可变的:是线程不安全的

    JAVA8-新日期API的简单使用

    LocalDate

    LocalTime

    MonthDay

    ...

    package com.dawa.jdk8.joda;
    
    import java.time.*;
    import java.time.temporal.ChronoUnit;
    import java.time.temporal.TemporalUnit;
    import java.util.Set;
    import java.util.TreeSet;
    
    public class JavaTimeTest {
        public static void main(String[] args) {
            // 获取当前的本地时间.
            LocalDate localDate = LocalDate.now();
            localDate.getYear();//年
            localDate.getMonth();// 月 英文形式
            localDate.getMonthValue();//月 1-12
            localDate.getDayOfMonth(); //得到当月的几号.
            System.out.println("-------");
    
            //LocalDate 直接使用数字构造.
            LocalDate localDate1 = LocalDate.of(2019, 3, 3);
            System.out.println(localDate1);
            System.out.println("-------");
    
            //月-天 (没有年的)
            //使用场景:你只关注月和日. 如生日.等 去除年份,不考虑年份.
            MonthDay monthDay = MonthDay.of(3, 24); //自定义构造
            MonthDay monthDay1 = MonthDay.from(localDate1);//从时间中获取
    
            //年-月 (没有日的)
            YearMonth yearMonth = YearMonth.of(1990, 2);
            System.out.println(yearMonth);
            System.out.println(yearMonth.lengthOfMonth()); //月的长度是多少天
            System.out.println(yearMonth.lengthOfYear()); //一年有多少天
            System.out.println(yearMonth.isLeapYear());//是否是闰年
    
            //localDate 关注年月日
            //localTime 关注时分秒
            LocalTime now = LocalTime.now();
            now.plusHours(3); //增加小时
            now.plusMinutes(30); //增加分钟
            now.plusSeconds(30);//增加秒
    
            System.out.println("-------");
            localDate.plus(2, ChronoUnit.WEEKS); //增加时间的通用方法.
    
            System.out.println("-------");
            localDate.minus(3, ChronoUnit.MONTHS); //减少时间的通用方法
    
            System.out.println("-------");
            Clock clock = Clock.systemDefaultZone(); //时刻
            clock.millis();//毫秒数
    
            System.out.println("---------");
            //判断两个时间的关系. 之前还是之后,ect...
            System.out.println(localDate.isAfter(localDate1));
            System.out.println(localDate.isBefore(localDate1));
            System.out.println(localDate.isEqual(localDate));
    
            //关于时区的概念: ZoneId
            Set<String> set = ZoneId.getAvailableZoneIds();
            set.forEach(System.out::println);  //列举出所有的时区的.  国家:名字
            //按照顺序打印.  构造块.TreeSet的一个子类的构造块.
            TreeSet<String> treeSet = new TreeSet<String>() {
                {
                    addAll(set);
                }
            };
            treeSet.forEach(System.out::println);
    
            //查看实现类的 底层的toString方法就知道了.
            //关于时区的操作:Asia/Shanghai
            ZoneId zoneId = ZoneId.of("Asia/Shanghai");
            LocalDateTime localDateTime = LocalDateTime.now();
    //        ZonedDateTime from = ZonedDateTime.from(localDateTime);//带有时区的时间
    //        System.out.println(from);
    
            System.out.println("------");
            //判断两个日期之间相隔的:年月日  (周期) Period类的应用.
            LocalDate localDate2 = LocalDate.now();
            LocalDate localDate3 = LocalDate.of(2018, 8, 4);
            Period period = Period.between(localDate2, localDate3);
            System.out.println(period.getYears());//相差的年
            System.out.println(period.getMonths());//相差的月
            System.out.println(period.getDays());//相差的天
    
    //        Instant类的使用 . UTC时间的呈现
            System.out.println(Instant.now());
            
        }
    }
    

    ChronoUnit 枚举(类型的类型)

            System.out.println("-------");
            localDate.plus(2, ChronoUnit.WEEKS); //增加时间的通用方法.
    
            System.out.println("-------");
            localDate.minus(3, ChronoUnit.MONTHS); //减少时间的通用方法 
    

    不用去管这个月多少天,多少周,只管去增加,减少就行了。

    Clock类

    System.out.println("-------");
    Clock clock = Clock.systemDefaultZone(); //时刻
    clock.millis();//毫秒数
    

    Period类, 周期函数(判断两个时间的 年,月,日。)


    如有需要自行查看JDK8提供的时间日期API。

    JAVA8学习——总结与回顾

    Lambda表达式

    函数式接口

    传递值&传递行为

    函数式编程思想

    方法引用

    默认方法

    收集器和比较器(Collectors&Comparators)

    流的使用

    流的底层运行原理

    并行与串行

    Optional类

    时间API

    函数式接口的使用

    函数式接口出现的原因

    方法引用和比较器(Collector)

    基础的重要性(和业务没关系)

    技术不是孤立的,兼容并包的一些心态。(万一你最初的想法就是错的呢)

    需要学习和了解的还有很多


    2020年01月08日16:25:21 JAVA8新特性课程学习结束。

  • 相关阅读:
    34组合总和(39)
    33 原子的数量(726)
    32 划分为k个相等的子集(698)
    31有效的井字游戏(794)
    30 设置交集大小至少为2
    28拼接最大数(321)
    js for循环闭包解决循环变量i遍历值
    js 绑定无响应 父元素监听,绑定子元素,事件绑定的几种方法以及区别
    如何让div+css兼容ie6 ie7 ie8 ie9和FireFox Chrome等浏览器
    css实现左侧固定宽,右侧自适应
  • 原文地址:https://www.cnblogs.com/bigbaby/p/12167354.html
Copyright © 2020-2023  润新知