当前位置: 代码网 > it编程>编程语言>Java > 时间处理的未来:Java 8全新日期与时间API完全解析

时间处理的未来:Java 8全新日期与时间API完全解析

2024年07月28日 Java 我要评论
《Java 8全新日期与时间API完全解析》这篇文章深入探讨了Java 8引入的全新日期与时间API的重要性和功能。文章详细介绍了这些API如何解决传统Java日期时间处理中的常见问题,如可变性和线程安全性。通过引入新的日期时间类(如LocalDate、LocalTime、LocalDateTime等),Java 8使得日期时间处理更加直观和易用,同时提升了性能和灵活性。此外,文章还探讨了如何在项目中逐步迁移旧的日期时间代码到新的API,以及新API如何与现有的Java类库互操作。

在这里插入图片描述

一、改进背景

java5的不足之处

  1. 非线程安全java.util.date 并不是线程安全的,在使用这个类时必须自己处理多线程并发问题。
  2. 设计不佳 :日期和日期格式化分布在多个包中,java.util.date 的默认日期,年是从1900开始,月从 1 开始,日从 0 开始,没有统一性。而且 date 类也缺少直接操作日期的相关方法。
  3. 时区处理困难:因为设计不佳,不得不编写大量代码来处理时区问题。

java8的改进方案

  1. 线程安全:新的日期时间api是线程安全的不仅没有setter方法,而且任何对实例的变更都会返回一个新的实例而保证原来的实例不变。
  2. 日期修改:新的日期时间api提供了大量的方法,用于修改日期时间的各个部分,并返回一个新的实例。
  3. : 在时区方面,新的日期时间api引入了域这个概念。
  4. 组合拆分:针对原来复杂的 api 进行重新组合和拆分,分成了好多个类。

二、本地日期时间

  1. localdate: 用于表示不含时区的日期,例如:2024-07-06。

    import java.time.localdate;
    import java.time.month;
    
    public class localdateexample {
        public static void main(string[] args) {
            // 获取当前日期
            localdate today = localdate.now();
            system.out.println("当前日期: " + today);
    
            // 创建指定日期
            localdate specificdate = localdate.of(2024, month.july, 6);
            system.out.println("指定日期: " + specificdate);
    
            // 日期操作示例
            localdate tomorrow = today.plusdays(1);
            system.out.println("明天的日期: " + tomorrow);
        }
    }
    
    // 输出
    当前日期: 2024-07-06
    指定日期: 2024-07-06
    明天的日期: 2024-07-07
    
  2. localtime: 用于表示不含时区的时间,例如:10:30:15.。

    import java.time.localtime;
    
    public class localtimeexample {
        public static void main(string[] args) {
            // 获取当前时间
            localtime currenttime = localtime.now();
            system.out.println("当前时间: " + currenttime);
    
            // 创建指定时间
            localtime specifictime = localtime.of(14, 30, 45);
            system.out.println("指定时间: " + specifictime);
    
            // 时间操作示例
            localtime latertime = currenttime.plushours(2);
            system.out.println("两小时后的时间: " + latertime);
        }
    }
    
    // 输出
    当前时间: 19:44:24.397
    指定时间: 14:30:45
    两小时后的时间: 21:44:24.397
    
  3. localdatetime: 用于表示不含时区的日期时间,例如:2024-07-06t10:30:15。

    import java.time.localdatetime;
    import java.time.month;
    
    public class localdatetimeexample {
        public static void main(string[] args) {
            // 获取当前日期时间
            localdatetime currentdatetime = localdatetime.now();
            system.out.println("当前日期时间: " + currentdatetime);
    
            // 创建指定日期时间
            localdatetime specificdatetime = localdatetime.of(2024, month.july, 6, 14, 30, 45);
            system.out.println("指定日期时间: " + specificdatetime);
    
            // 日期时间操作示例
            localdatetime laterdatetime = currentdatetime.plusdays(1).plushours(2);
            system.out.println("明天两小时后的日期时间: " + laterdatetime);
        }
    }
    
    // 输出
    当前日期时间: 2024-07-06t19:45:55.358
    指定日期时间: 2024-07-06t14:30:45
    明天两小时后的日期时间: 2024-07-07t21:45:55.358
    

三、时区日期时间

  1. zoneddatetime :处理带时区的日期时间的类,它包含了本地日期时间和对应的时区信息。
import java.time.*;

public class zoneddatetimeexample {
    public static void main(string[] args) {
        // 获取当前日期时间
        localdatetime localdatetime = localdatetime.now();

        // 创建 zoneddatetime 对象
        // 时区id
        zoneid zoneid = zoneid.of("asia/shanghai");
        zoneddatetime zoneddatetime = zoneddatetime.of(localdatetime, zoneid);

        system.out.println("当前日期时间和时区: " + zoneddatetime);

        // 获取其它时区的日期时间
        zoneid newyorkzoneid = zoneid.of("america/new_york");
        zoneddatetime newyorkdatetime = zoneddatetime.withzonesameinstant(newyorkzoneid);
        system.out.println("纽约的日期时间: " + newyorkdatetime);

        // 当前的日期时间
        zoneddatetime now = zoneddatetime.now();
        system.out.println("当前日期时间是:" + now);
        system.out.println("当前时区是: " + now.getzone());

        localdate date = now.tolocaldate();
        system.out.println("本地日期是:" + now);

        localtime time = now.tolocaltime();
        system.out.println("本地时间是:" + time);
    }
}

// 输出
当前日期时间和时区: 2024-07-06t20:07:56.439+08:00[asia/shanghai]
纽约的日期时间: 2024-07-06t08:07:56.439-04:00[america/new_york]
当前日期时间是:2024-07-06t20:07:56.508+08:00[gmt+08:00]
当前时区是: gmt+08:00
本地日期是:2024-07-06t20:07:56.508+08:00[gmt+08:00]
本地时间是:20:07:56.508
  1. zoneid:表示时区的标识符,可以通过它来获取具体的时区信息。
public class zoneidexample {
    public static void main(string[] args) {
        // 获取所有的可用时区id
        system.out.println("所有可用的时区id: " + zoneid.getavailablezoneids());

        // 获取特定时区的信息
        zoneid zoneid = zoneid.of("asia/tokyo");
        system.out.println("时区id为 asia/tokyo 的信息: " + zoneid);
        
        // 获取当前时区
        zoneid currentzone = zoneid.systemdefault();
        system.out.println("当前时区是: " + currentzone);
    }
}

// 输出
所有可用的时区id: [asia/aden, america/cuiaba,……]
时区idasia/tokyo 的信息: asia/tokyo
当前时区是: gmt+08:00

四、格式化

import java.time.localdatetime;
import java.time.zoneddatetime;
import java.time.format.datetimeformatter;

public class datetimeformatterexample {
    public static void main(string[] args) {
        // 当前时间
        zoneddatetime now = zoneddatetime.now();
        system.out.println("当前时间是: " + now);

        system.out.println("另一种表示形式:" + now.format(datetimeformatter.rfc_1123_date_time));

        // 创建一个 datetimeformatter 对象并使用预定义格式
        datetimeformatter formatter = datetimeformatter.ofpattern("yyyy-mm-dd hh:mm:ss");

        // 格式化 localdatetime 对象
        string formatteddatetime = now.format(formatter);
        system.out.println("格式化后的日期时间: " + formatteddatetime);

        // 解析字符串到 localdatetime 对象
        localdatetime parseddatetime = localdatetime.parse(formatteddatetime, formatter);
        system.out.println("解析后的日期时间: " + parseddatetime);
    }
}

java 8 提供了许多预定义的格式化模式

  • yyyy-mm-dd
  • yyyy-mm-dd hh:mm:ss
  • mmm dd, yyyy hh:mm:ss
  • 等等…

可以根据需要选择合适的格式化模式来格式化或解析日期时间字符串,使用自定义格式时要确保格式与输入字符串的格式匹配,否则会导致解析失败或异常 。

闲暇是霓裳,不宜常穿用

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com