详解Java中的日期和时间

这里写目录标题

介绍

本文主要是对Java里面的时间和日期进行归纳和对比,主要包括Date、Calendar、LocalDate、LocalTime、LocalDateTime和instant,以及格式化和解析方法SimpleDateFormat和DateTimeFormat的对比分析。

具体用法

java 复制代码
 		Date currentTime = new Date();
        // currentTime: Tue Apr 23 14:50:19 GMT+08:00 2024
        Logger.d(TAG, "currentTime: " + currentTime.toString());
        // currentTime: 2024-04-23 14:50:19
        Logger.i(TAG, "currentTime: " + FORMAT.format(currentTime));


        // Calendar
        Calendar calendar = Calendar.getInstance();
        int many = calendar.get(Calendar.DAY_OF_YEAR);
        // 今天是第 114 天
        Logger.i(TAG, "今天是第 " + many + " 天");
        // calendar: Tue Apr 23 16:48:08 GMT+08:00 2024
        Logger.i(TAG, "calendar: " + calendar.getTime().toString());
        // calendar: 2024-04-23 16:48:08
        Logger.i(TAG, "calendar: " + FORMAT.format(calendar.getTime()));


        // LocalDate
        LocalDate today = LocalDate.now();
        // today: 2024-04-23
        Logger.i(TAG, "LocalDate: " + today);
        LocalDate laterDate = today.plusDays(30);
        // laterDate: 2024-05-23
        Logger.i(TAG, "LocalDate laterDate: " + laterDate);

        // LocalDateTime
        LocalDateTime now = LocalDateTime.now();
        // now: 2024-04-23T16:48:08.000
        Logger.i(TAG, "LocalDateTime: " + now);
        Logger.i(TAG, "LocalDateTime format: " + now.format(dateTimeFormatter));

        // LocalTime
        LocalTime nowTime = LocalTime.now();
        // LocalTime: 17:08:24.187
        Logger.i(TAG, "LocalTime: " + nowTime);
        LocalTime americaTime = LocalTime.now(ZoneId.of("America/New_York"));
        // LocalTime americaTime: 05:11:30.331
        Logger.i(TAG, "LocalTime americaTime: " + americaTime);

        // Instant
        Instant nowInstant = Instant.now();
        // 获取当前时间戳
        long second = nowInstant.getEpochSecond();
        // Instant: 2024-04-23T09:15:23.921Z
        Logger.i(TAG, "Instant: " + nowInstant);
        // Instant second: 1713863723
        Logger.i(TAG, "Instant second: " + second);
        Instant getTime = Instant.ofEpochSecond(1540054530);
        // Instant getTime: 2018-10-20T16:55:30Z
        Logger.i(TAG, "Instant getTime: " + getTime);
        

总结

Date和Calendar是Java代码中旧版API的类,在Java.Util包中,设计最初功能较复杂时间较久远,有的类和方法已过期,并且是可变线程不安全的,不推荐使用;

LocalDate、LocalDateTime、LocalTime和Instant是Java代码中新版的API,在Java.time包中,设计和用法更加规范,是jdk1.8之后引入的,不可变并且线程安全,推荐使用。

  • Date:旧版本日期和时间类,线程不安全,已过时,被java.time 包中的现代日期时间API所替代

  • Calendar:java.util包中的日期类,包含日期、时间和时区信息。线程不安全,旧日期API,被java.time 包中的现代日期时间API所替代

  • LocalDate:java8新增,仅表示日期类,无关时区,线程安全(适用于生日、纪念日、截止日期等不关心具体时间的场合)

  • LocalDateTime:java8新增,表示日期和时间,线程安全

  • LocalTime:java8新增,仅表示时间类,不包含日期,线程安全

  • Instant:高精度的时间戳,不可变且线程安全,适合需要精确、全局统一时间点的场景

    (适用于服务器日志记录、分布式系统的时间同步、网络通信中的时间戳标记等)

SimpleDateFormat和DateTimeFormatter区别

  • SimpleDateFormat:位于Java.util包中,线程不安全,对应旧版API日期的格式化或解析使用,高并发场景慎用
  • DateTimeFormatter: 位于Java.time包中,对应新版API格式化或解析,支持国际化和自定义格式模式,线程安全

参考链接

相关推荐
SimonKing20 小时前
【工具库推荐】Java开发者必备:6款HTTP客户端神器,从经典到未来
java·后端·程序员
树码小子20 小时前
Java网络编程:(socket API编程:TCP协议的 socket API -- 回显程序的服务器端程序的编写)
java·网络·tcp/ip
Aomnitrix20 小时前
知识管理新范式——cpolar+Wiki.js打造企业级分布式知识库
开发语言·javascript·分布式
努力也学不会java20 小时前
【设计模式】抽象工厂模式
java·设计模式·oracle·抽象工厂模式
用户60830892904720 小时前
集合处理利器,Java中的Stream流API
java·后端
玉衡子20 小时前
八、MySQL全局优化总结&MySQL8新特性
java·mysql
9号达人21 小时前
Java 14 新特性详解与实践
java·后端·面试
ytadpole21 小时前
揭秘XXL-JOB:Bean、GLUE 与脚本模式的底层奥秘
java·后端
每天回答3个问题21 小时前
UE5C++编译遇到MSB3073
开发语言·c++·ue5
计算机毕业设计木哥21 小时前
计算机毕设选题推荐:基于Java+SpringBoot物品租赁管理系统【源码+文档+调试】
java·vue.js·spring boot·mysql·spark·毕业设计·课程设计