JDK1.8 之前支持的时间操作:
- System.currentTimeMillis() :表示自1970年1月1日起的当前日期和时间(以毫秒为单位)。
- java.util.Date :表示特定时间点,以毫秒为单位。
- java.util.Calendar :一个抽象类,提供用于在实例之间进行转换并以不同的方式处理日历字段的方法。
- java.text.SimpleDateFormat :来格式化和解析日期。
- java.util.TimeZone :代表时区偏移量,还可以计算出夏令时。
问题
- 一个Date类应代表一个日期,但它代表一个具有小时,分钟和秒的实例。
- Date没有任何关联的时区。它会自动选择默认时区。
- 类是可变的。
- 日期格式化类也不是线程安全的。
- 和java.sql.Date重名
- 使用其他时区创建日期非常棘手,通常会导致错误的结果。
- 月使用从零开始的索引,让人费解
jdk8的新api
- java.time.LocalDate:表示ISO日历中的年月日,对于表示没有时间的日期很有用。它可用于表示仅日期的信息,例如出生日期或结婚日期。
- java.time.LocalTime:仅按时交易。它对于表示基于人的时间(例如电影时间或本地图书馆的开放和关闭时间)很有用。
- java.time.LocalDateTime:处理日期和时间,没有时区。它是LocalDate和LocalTime的组合。
- java.time.ZonedDateTime:将LocalDateTime类与ZoneId类中提供的区域信息结合在一起。它代表完整的日期时间戳以及时区信息。
- java.time.OffsetTime :处理时间与格林威治/ UTC有相应时区偏移的时间,而没有时区ID。
- java.time.OffsetDateTime :处理日期和时间,该日期和时间具有与格林威治/ UTC相对应的时区偏移,但没有时区ID。
- java.time.Clock:提供对任何给定时区中的当前时刻,日期和时间的访问。尽管使用Clock类是可选的,但是此功能使我们可以测试其他时区的代码,也可以使用时间不变的固定时钟来测试您的代码。
- java.time.Instant:表示时间轴上的纳秒的开始(自EPOCH开始),对于生成表示机器时间的时间戳很有用
- java.time.Duration :两个瞬间之间的差异,以秒或纳秒为单位,并且不使用基于日期的构造,例如年,月和日,尽管该类提供了转换为天,小时和分钟的方法。
- java.time.Period :以基于日期的值(年,月,日)定义日期之间的差异。
- java.time.ZoneId:指定时区标识符,并提供在Instant和LocalDateTime之间进行转换的规则。
- java.time.ZoneOffset :指定相对格林威治/ UTC时间的时区偏移量。
- java.time.format.DateTimeFormatter:提供了许多预定义的格式化程序,或者我们可以定义自己的格式化程序。它提供parse()或format()方法来解析和格式化日期时间值。