9.日期时间类

第一代日期类

类结构
代码演示
java 复制代码
public class Date_ {
   public static void main(String[] args) throws ParseException {
        //构造方法1
        Date now = new Date();
        System.out.println(now);
        System.out.println(now.toString());
        //构造方法2 参数表示的是 从 1970-01-01 00:00:00 UTC 开始经过的毫秒数
        Date d2 = new Date(1792581127826);
        System.out.println(d2);
        //可以配合SimpleDataFormat类,转换成自己想要的格式
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println(sdf.format(now));
        System.out.println(sdf.format(d2));
        /*
         * parse 将字符串转化成对应的date对象
         * 字符串的格式需要和new SimpleDateFormat时候的格式相同
         */
        String s = "2222-02-22 22:22:22 星期三";
        Date d = sdf.parse(s);
        System.out.println(d.getTime());
        //getTime() 和currentTimeMillis() 得到一个long型的整数,表示当前时间戳
        //不过由于机器性能的原因,可能会相差几十毫秒,毕竟每执行一行代码,都是需要时间的
        System.out.println(now.getTime());
        System.out.println(System.currentTimeMillis());
        System.out.printf("1995年这一年种的一个随机时间 %s ", sdf.format(getRandomDateTime("1995", "1995")));
        System.out.println();
        //练习
        String[] dates = new String[9];
        for (int i = 0; i < dates.length; i++) {
            dates[i] = sdf.format(getRandomDateTime("1970", "2000"));
        }
        System.out.println("init dates:" + Arrays.toString(dates));
        Arrays.sort(dates, (sd1, sd2)->{
            try {
                Date p1 = sdf.parse(sd1);
                Date p2 = sdf.parse(sd2);
                return p2.compareTo(p1);
            } catch (ParseException e) {
                throw new RuntimeException(e);
            }
        });
        System.out.println(Arrays.toString(dates));
    }

    public static Date getRandomDateTime(String startYear, String endYear) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String start = startYear + "-01-01 00:00:00";
        String end = endYear + "-12-31 23:59:59";
        Date ps = sdf.parse(start);
        Date pd = sdf.parse(end);
        long yearMs = pd.getTime() - ps.getTime();
        long rl = (long)(Math.random() * yearMs);
        return new Date(ps.getTime() + rl);
    }
}

SimpleDateFormat类定义了以下模式字母(所有其他字符 'A' 到 'Z' 和 'a' 到 'z' 都被保留):

第二代日期类

类结构

类特性:

  1. Calendar是一个抽象类(不能被实例化),构造器都是protected类型的,所以java.util包之外的类无法通过Calendar的构造器创建对象。
  2. 可以通过getInstance方法获取实例
  3. 提供了大量的方法和属性。
  4. 没有提供对应的格式化类。需要自己类组合。
代码示例
java 复制代码
public class Calendar_ {
    public static void main(String[] args) {
        //类似于单例,通过getInstance()创建对象
        Calendar c = Calendar.getInstance();
        System.out.println(c);
        //获取日历对象的某个日历字段
        System.out.println("年:" + c.get(Calendar.YEAR));
        //这里的月份是从0开始的,所以要加1
        System.out.println("月:" + (c.get(Calendar.MONTH) + 1));
        System.out.println("日:" + c.get(Calendar.DAY_OF_MONTH));
        System.out.println("小时:" + c.get(Calendar.HOUR));

        System.out.println("分钟:" + c.get(Calendar.MINUTE));
        System.out.println("秒:" + c.get(Calendar.SECOND));

        //Calender 没有专门的格式化方法,所以需要程序员自己来组合显示
        System.out.println(c.get(Calendar.YEAR) + " 年" + (c.get(Calendar.MONTH) + 1)
                + " 月 " + c.get(Calendar.DAY_OF_MONTH) + "日");
    }
}

Calendar也存在问题:

  1. 可变性:像日期和时间这样的类应该是不可变的。

  2. 偏移性:Date中的年份是从1900开始的,而月份都从0开始。

  3. 格式化:格式化只对Date有用,Calendar则不行。

  4. 此外,它们也不是线程安全的;不能处理闰秒等(什么是瑞年?每隔2天,多出1s)。

第三代日期类(jdk8后增加)

类结构

代码示例
java 复制代码
public class LocalDate_ {
    public static void main(String[] args) {
        LocalDateTime now = LocalDateTime.now(); //年月日时分秒
        LocalDate date = LocalDate.now(); //只需要年月日
        LocalTime time = LocalTime.now();//只需要时间
        System.out.println(now);
        System.out.println(date);
        System.out.println(time);
        //常用方法
        System.out.println("年:" + now.getYear());
        System.out.println("月:" + now.getMonthValue());
        System.out.println("月:" + now.getMonth());
        System.out.println("日:" + now.getDayOfMonth());
        System.out.println("时:" + now.getHour());
        System.out.println("分:" + now.getMinute());
        System.out.println("秒:" + now.getSecond());
        //时间格式化 DateTimeFormatter类(类似于SimpleDateFormat类)
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH时 mm分 ss秒");
        System.out.println(dtf.format(now));
    }
}

All letters 'A' to 'Z' and 'a' to 'z' are reserved as pattern letters. The following pattern letters are defined

Instant 时间戳类

类似于Date类,并且提供了一系列与Date转换的方式

java 复制代码
public class Instant_ {
    public static void main(String[] args) {
        //获取当前时间戳对象
        Instant now = Instant.now();
        System.out.println(now);
        //Instant ---> Date
        Date date = Date.from(now);
        System.out.println(date);
        //Date--->instant
        Instant instant = date.toInstant();
        System.out.println(instant);
    }
}
第三代日期类更多方法
  • LocalDateTime 类
  • MonthDay类: 检查重复事件
  • 是否是闰年
  • 增加日期的某个部分
  • 使用plus方法测试增加时间的某个部分
  • 使用minus方法测试查看一年前和一年后的日期
java 复制代码
public class LocalDate_ {
    public static void main(String[] args) {
        //plus、minus系列方法可以对当前时间进行增加和减少
        LocalDateTime plus = now.plusDays(300);
        System.out.println("300天之后的日期:" + dtf.format(plus));
        LocalDateTime minus = now.minusDays(100);
        System.out.println("100天之前的日期:" + dtf.format(minus));
        LocalDateTime lastMinMinus = now.minusMinutes(30);
        System.out.println("30分钟之前的日期:" + dtf.format(lastMinMinus));
        LocalDateTime addYearPlus = now.plusYears(20);
        System.out.println("20年之后的日期:" + dtf.format(addYearPlus));
    }
}

开发中尽量使用第三代日期类

相关推荐
非优秀程序员1 小时前
第04章 邮箱大战,163 与 QQ 的暗战|《互联网产品恩仇录》
java·vue.js·架构
知已难寻2 小时前
Docker 入门:容器技术与 Docker 基础
java·运维·服务器·docker·云原生·容器
文丑颜不良啊4 小时前
LeetCode2481~2500题目解析
java·leetcode
Flynn Liang5 小时前
同一需求三套写法:用 Spring AI、LangChain4j、AgentScope Java 各实现一个带工具调用的 RAG 助手(实战对比)
java·人工智能·大模型·架构设计·spring ai·langchain4j·agentscope
聪明的笨猪猪5 小时前
实际工程问题:AI 生成 Spring Cache(@Cacheable / @CachePut / @CacheEvict)缓存注解踩坑
java·经验分享·面试·ai编程
愿有所息6 小时前
记一次 ARM64 + JDK8 上 fastjson2 的诡异数据错乱
java
秋饼6 小时前
MCP 2026-07-28 无状态协议大改版:Spring AI 2.1 多轮往返请求与网关路由落地
java·ai·技术分享·后端开发
SL_staff7 小时前
JVS-BI 实战:业务人员如何用零代码 ELT + 可视化配置构建实时经营分析闭环
java·spring·全栈
SL_staff8 小时前
企业AI落地难?JVS-AI渐进式实践:安全可控、小切口验证、标准化沉淀与规模化复制
java·开源·aigc
SL_staff9 小时前
JVS数字底座实践:构建企业级统一内容管理平台的技术路径
java·产品