Java Date类介绍
1、Java Date类的数据结构
Java中的java.util.Date类是Java早期版本中用于表示日期和时间的基本类。内部数据结构中,核心为:
private transient long fastTime;
其中,transient指无需序列化的属性。
2、fastTime属性
可以看到Date类本质上是对一个long类型值的封装,long是java基本数据类型,占据8个字节,即64位数字。
这个fastTime存储的是:
自1970年1月1日00:00:00 GMT(纪元时间)以来的毫秒数。
正数表示纪元之后的日期,负数表示纪元之前的日期。
其中,GMT时间,指的就是英国格林威治时间,是0时区时间。
3、Date的问题
时区问题:用toString()方法会使用JVM的默认时区进行显示。
因此,这个工具类很大程度上被弃用(@Deprecated)了。
目前最常用的是java.time包中的新API,比如LocalDateTime。
4、扩展:java.util.Date和java.sql.Date
Date类型,常用的有两种,sql中Date和Java中的Date。
sql.Date继承于util.Date,没有时分秒的概念,只保留日期,与SQL中的Date对应。
当然,由于继承自util.Date,其实用性比较差。
目前开发,也有很多人采用String存储时间类型,比如“2002-01-12T20:10:39Z”。
其中,Z代表0时区,也就是GMT格林威治标准时间。
这种方式的好处在于,看起来很直观,而且前端解析也比较容易,前后端的传输更加简单。
不需要考虑前后端传输时可能产生的时区不一致,导致时间偏移问题。
时间偏移问题的特点是,前端服务器采用东八区,JVM采用0时区,这时候前后传输,可能导致时间偏移。
5、拓展2:前端JavaScript中的Date类型数据结构
目前常用的vue框架,其Date类型实质也为js的Date类型。
JavaScript中的Date类型是用于处理日期和时间的内置对象,其数据结构和工作原理与Java等语言中的Date类有所不同。
基本数据结构JavaScript的Date对象本质上是一个时间戳包装器,其核心数据结构特点包括:
1. 内部存储:Date对象内部存储的是自UTC时间1970年1月1日零时开始经过的毫秒数(时间戳)
2. 时区处理:默认情况下,Date对象表示的是本地时间(基于运行环境的时区设置),但也提供UTC相关方法处理全球统一时间
5.1、创建Date对象的方式
JavaScript提供了多种创建Date对象的方式,其中比较好用的,是字符串传入构造。
// 传入日期字符串(不同浏览器解析可能有差异)
let strDate = new Date("2023-06-21T10:30:15");
可以关注到,这个字符串没有设置时区,所以一般使用本地时区。
这个字符串也没涉及到毫秒数,所以使用秒精度即可。
5.2、Date对象提供的主要功能
主要方法和功能为了解析、操作日期时间的各个部分,Date对象提供了丰富的方法:
5.2.1、获取方法(本地时间)
let date = new Date();
date.getFullYear(); // 四位年份,如2025
date.getMonth(); // 月份(0-11)【使用时需要+1】
date.getDate(); // 日期(1-31)
date.getHours(); // 小时(0-23)
date.getMinutes(); // 分钟(0-59)
date.getSeconds(); // 秒数(0-59)
date.getMilliseconds(); // 毫秒(0-999)
date.getDay(); // 星期几(0=周日,6=周六)
5.2.2、时间戳相关
date.getTime(); // 获取时间戳(毫秒)
date.valueOf(); // 同getTime()
Date.now(); // 静态方法,返回当前时间戳
5.2.3、格式化输出
JavaScript提供了多种格式化输出日期的方法:
let date = new Date();
date.toString(); // "Tue Jun 21 2023 10:30:15 GMT+0800 (中国标准时间)"
date.toDateString(); // "Tue Jun 21 2023"date.toTimeString(); // "10:30:15 GMT+0800 (中国标准时间)"
date.toLocaleString(); // "2023/6/21 10:30:15"(根据本地设置)
date.toISOString(); // "2023-06-21T02:30:15.000Z"(ISO格式,UTC时间)