在学习SpringMVC时,遇到了接收时间日期类型的参数的案例。
回顾JDK中与时间日期相关的API。
来系统地学习一下日期时间相关的API。
前置知识
在世界上有统一的时间标准
- 格林尼治时间,简称GMT(以伦敦的本初子午线为标准),已被弃用
- 目前是以原子钟作为世界标准时间,简称UTC
计算机的时间原点 1970年1月1日 0点0分0秒
JDK7相关类
Date类
Date类是JDK中提供的一个时间类,用来描述时间,精确到毫秒,位于java.util包下。
- 通过无参构造创建Date对象,默认表示系统当前时间。
- 通过有参构造创建Date对象,表示指定的时间。
原理:在该类中,利用一个long类型的私有属性来表示自从时间原点以来的毫秒值
| 方法名 | 描述 |
| ------------------ | ------------------------------ |
| Date() | 创建一个当前系统时间的Date对象 |
| Date(long time) | 创建一个指定时间的Date对象 |
| setTime(long time) | 修改Date对象中的毫秒值 |
| getTime() | 返回该对象的毫秒值,类型是一个long |
该类中还有getDay()、getMonth()等方法,已经不推荐使用了,只需要了解以上的内容即可。
SimpleDateFormat
因为Date对象只能打印默认的样式,不能格式化,因此SimpleDateFormat类就有了。
此类的对象就是一个日期时间格式化器,SimpleDateFormat类的作用
- 格式化:返回特定格式的日期时间字符串
- 解析:将字符串解析为Date对象(有了Date对象就可以对日期时间进行运算)
常用的方法:
| 方法名称 | 描述 |
| -------------------------------- | ------------------------------------------------ |
| SimpleDateFormat() | 构造方法,获取一个默认格式的SimpleDateFormat对象 |
| SimpleDateFormat(String pattern) | 构造一个指定格式的对象 |
| public String format(Date date) | 格式化,Date对象 --> 指定格式的String |
| public Date parse(String date) | 解析,字符串 --> 日期对象 |
如何来指定日期格式
以上是常用的格式,JDK的官方文档中更加详细
先来看返回指定格式的日期字符串
再来看通过指定日期的字符串来返回一个Date对象
一个SimpleDateFormat对象只能格式化或解析一种指定格式的,如果需要其他格式,则需要重新创建另一个SimpleDateFormat对象
Canlender
JDK提供的日历类,为了方便日期运算而产生。
一个Canlendar实例代表了当前系统时间的日历对象,可以以年、月、日等不同单位来快速运算日期时间,功能十分强大。
Calendar是一个抽象类,不能直接创建对象,需要通过静态方法getInstance()来获取一个Calendar的实现类对象
常用的API
获取字段
在Calendar中,通过一个数组来维护Date对象的年、月、日、时、分、秒等信息,为了方便获取某个字段的值,在Calendar中定义了一些表示索引的常量,可以通过具体的源码来查看。
注意:
在获取月份时是 0 ~ 11 , 也就是说获取的是1 , 其实是2月份
在获取周时,星期日为1,星期六为7
日期运算
通过调用Calendar对象的add方法来进行某个字段的加减。
或通过set()方法直接对某个字段进行重新赋值。
JDK8新增日期类
ZoneId
ZoneId表示时区。
一个ZoneId实例就代表一个时区对象。
JDK8 为全世界的很多地方的时区都有了划分,比如Asia/Shanghai。
Instant
Instant实例代表一个时间戳。
ZoneDateTime
ZoneDateTime是一个带有时区的时间。
DateTimeFormatter
有些类似于SimpleDateFormat类,
用于时间的格式化和解析。
LocalDate、LocalTime、LocalDateTime
- LocalDate代表年、月、日的日历类
- LocalTime代表时、分、秒的日历类
- LocalDateTime代表年、月、日、时、分、秒的日历类
其中LocalDateTime还可以转换成LocalDate和LocalDateTime
Duration、Period、ChronoUnit
在JDK8中增加了关于时间间隔的类,能够表示时间间隔。