Java8特性:时间日期处理类

对比

在旧版的 Java 中,日期时间 API 存在诸多问题,其中有:

  • 非线程安全 − java.util.Date 是非线程安全的,所有的日期类都是可变的,这是Java日期类最大的问题之一。
  • 设计很差 − Java的日期/时间类的定义并不一致,在java.util和java.sql的包中都有日期类,此外用于格式化和解析的类在java.text包中定义。java.util.Date同时包含日期和时间,而java.sql.Date仅包含日期,将其纳入java.sql包并不合理。另外这两个类都有相同的名字,这本身就是一个非常糟糕的设计。
  • 时区处理麻烦 − 日期类并不提供国际化,没有时区支持,因此Java引入了java.util.Calendar和java.util.TimeZone类,但他们同样存在上述所有的问题。

常用类

  • LocalDate:不包含时间的日期,比如2019-10-14。可以用来存储生日,周年纪念日,入职日期等。

  • LocalTime:与LocalDate想对照,它是不包含日期的时间,例如23:24:24。

  • LocalDateTime:包含了日期及时间,没有偏移信息(时区)。

  • ZonedDateTime:包含时区的完整的日期时间,偏移量是以UTC/格林威治时间为基准的。

  • Instant:时间戳,与System.currentTimeMillis()类似。

  • Duration:表示一个时间段。

  • Period:用来表示以年月日来衡量一个时间段。

常用类实列

  1. LocalDate LocalTime LocalDateTime。可以对当前的时间日期等进行相应处理

        public static void main(String[] args) {
    
            /**
             * 日期类LocalDate
             */
            //获取本地日期  2020-12-11
            LocalDate ld = LocalDate.now();
            System.out.println(ld);
    
            //日期获取年月日
            int dayOfYear = ld.getDayOfYear();//一年中的第几天 346
            int dayOfMonth = ld.getDayOfMonth();//一年中的第几个月11
            DayOfWeek dayOfWeek = ld.getDayOfWeek();//一年中的第几周
            int year = ld.getYear();//年份2020
            Month month = ld.getMonth();//月分DECEMBER
            System.out.println(dayOfYear + " " + dayOfMonth + " " + dayOfWeek + " " + year + " " + month);
            System.out.println("日期类LocalDate---------------------------");
    
    
            /**
             * 日期时间类
             */
            //获取本地当前时间  2020-12-11T13:32:16.556
            LocalDateTime ldt = LocalDateTime.now();
            System.out.println(ldt);
    
            int dayOfYearT = ldt.getDayOfYear();//一年中的第几天 346
            int dayOfMonthT = ldt.getDayOfMonth();//一年中的第几个月11
            DayOfWeek dayOfWeekT = ldt.getDayOfWeek();//一年中的第几周
            int year1 = ldt.getYear();//年份2020
            Month month1 = ldt.getMonth();//月分DECEMBER
            int hour = ldt.getHour();//时
            int minute = ldt.getMinute();//分钟
            int second = ldt.getSecond();//秒
            System.out.println(dayOfYearT + " " + dayOfMonthT + " " + dayOfWeekT + " " + year1 + " " + month1 + " " + hour + " " + minute + " " + second);
            System.out.println("-----------------------------");
    
            /**
             * LocalTime
             */
            LocalTime now = LocalTime.now();//时间13:58:22.826
            LocalTime of = LocalTime.of(23, 24, 24);//指定时间23:24:24
            LocalTime ptr = LocalTime.parse("11:15:30");
            System.out.println(now + "    "+of+"    "+ptr);
            System.out.println("LocalTime------------------------------");
    
            /**
             * 日期时间类和日期类的相互转化
             */
            //本地日期时间转化为本地日期本地时间
            LocalDate ld1 = ldt.toLocalDate();
            LocalTime lt1 = ldt.toLocalTime();
            //2020-12-11
            System.out.println(ld1);
            //13:34:38.038
            System.out.println(lt1);
            System.out.println("LocalDate--------LocalDateTime------------LocalTime");
    
        }
    
  2. ZonedDateTime类,用于处理带时区的日期和时间。ZoneId表示不同的时区。大约有40不同的时区

    public static void main(String[] args) {

        // 获取可用的时区
        Set<String> availableZoneIds = ZoneId.getAvailableZoneIds();
        availableZoneIds.forEach((a) -> System.out.println(a));
        System.out.println("----------------------------------");

        //获取当前时区
        ZoneId zoneId = ZoneId.systemDefault();
        System.out.println(zoneId);
        ZoneRules rules = zoneId.getRules();
        String id = zoneId.getId();
        System.out.println(rules+"  "+"  "+id);
        System.out.println("----------------------------------");

        // 创建时区
        ZoneId of = ZoneId.of("Asia/Shanghai");
        System.out.println(of);
        System.out.println("----------------------------------");

        //获取当前时区时间日期还可以用now获取具体的事件日期时区等
       ZonedDateTime zonedDateTime = ZonedDateTime.of(LocalDateTime.now(), zoneId);
        ZonedDateTime now = ZonedDateTime.now();
        System.out.println(zonedDateTime);
        System.out.println(now);

    }

  1. Instant用于一个时间戳,与System.currentTimeMillis()类似,但Instant可以精确到纳秒(Nano-Second)。

    Instant除了可以使用now()方法创建,还可以通过ofEpochSecond方法创建。

     public static void main(String[] args) {
            Instant now = Instant.now();
            System.out.println(now);
    
            //指定毫秒值100
            Instant instant = Instant.ofEpochSecond(365 * 24 * 60, 100);
            System.out.println(instant);
    
            //获取毫秒值
            int nano = now.getNano();
            System.out.println(nano);
    
        }
    
  2. Duration: Duration的内部实现与Instant类似,但Duration表示时间段,通过between方法创建。

    public static void main(String[] args) {
            LocalDateTime from = LocalDateTime.now();//当前时间
            LocalDateTime to = LocalDateTime.now().plusDays(1);//当前时间加上一天
            Duration duration = Duration.between(from, to);// 指定为当前时间到当前加上一天的时间
    
            long l2 = duration.toDays();
            long l = duration.toHours();
            long l1 = duration.toMillis();
            long l3 = duration.toNanos();
            System.out.println(l2 + "天=" + l + "小时=" + l1 + "秒=" + l3 + "微秒");
        }
    
  3. Period与Duration类似,获取一个时间段,只不过单位为年月日,也可以通过of方法和between方法创建,between方法接收的参数为LocalDate。

    public static void main(String[] args) {
        Period period = Period.of(1, 10, 25);
        int days = period.getDays();
        System.out.println(days);
        int months = period.getMonths();
        System.out.println(months);
        int years = period.getYears();
        System.out.println(years);
        IsoChronology chronology = period.getChronology();//获取年表
        System.out.println(chronology);
        List<TemporalUnit> units = period.getUnits();
        System.out.println(units);//获取单位

        System.out.println(period);
        Period period1 = Period.between(LocalDate.now(), LocalDate.now().plusYears(1));
        System.out.println(period1);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值