Java日期和时间

java.time、java.util、java.sql和java.text包中包含了用于表示日期和时间的类。以下是在Java中处理日期的重要类。

Java 8日期/时间API

自Java 8以来,Java引入了一个新的日期和时间API。java.time包包含了Java 8的日期和时间类。

  • java.time.LocalDate类
  • java.time.LocalTime类
  • java.time.LocalDateTime类
  • java.time.MonthDay类
  • java.time.OffsetTime类
  • java.time.OffsetDateTime类
  • java.time.Clock类
  • java.time.ZonedDateTime类
  • java.time.ZoneId类
  • java.time.ZoneOffset类
  • java.time.Year类
  • java.time.YearMonth类
  • java.time.Period类
  • java.time.Duration类
  • java.time.Instant类
  • java.time.DayOfWeek枚举
  • java.time.Month枚举

经典的日期/时间API

但经典或旧的Java日期API也是有用的。让我们看看经典的日期和时间类的列表。

  • java.util.Date类
  • java.sql.Date类
  • java.util.Calendar类
  • java.util.GregorianCalendar类
  • java.util.TimeZone类
  • java.sql.Time类
  • java.sql.Timestamp类

格式化日期和时间

我们可以使用以下类来格式化Java中的日期和时间:

  • java.text.DateFormat类
  • java.text.SimpleDateFormat类

Java日期和时间API

Java使用java.time和java.util两个包来提供日期和时间功能。java.time包在Java 8中引入,新引入的类试图克服传统的java.util.Date和java.util.Calendar类的缺点。

经典的日期时间API类

Java 8发布之前的主要类有:

Java.lang.System:该类提供了currentTimeMillis()方法,以毫秒为单位返回当前时间。它显示从1970年1月1日起的当前日期和时间的毫秒数。

java.util.Date:它用于显示特定的时间点,以毫秒为单位。

java.util.Calendar:这是一个抽象类,提供了在不同方式上转换实例和操作日历字段的方法。

java.text.SimpleDateFormat:它是一个用于按照预定义方式或用户定义的模式格式化和解析日期的类。

java.util.TimeZone:它表示时区偏移,并确定夏令时。

现有日期/时间API的缺点

  1. 线程安全:现有的Date和Calendar等类不提供线程安全性。因此,这会导致开发人员需要处理难以调试的并发问题。Java 8的新日期和时间API提供了线程安全性,并且是不可变的,从而避免了开发人员面临的并发问题。
  2. 糟糕的API设计:传统的Date和Calendar API不提供执行基本日常功能的方法。Java 8中引入的日期和时间类以ISO为中心,提供了许多不同的方法来执行与日期、时间、持续时间和周期相关的操作。
  3. 复杂的时区处理:使用传统的Date和Calendar类处理时区是困难的,因为开发人员需要编写处理时区的逻辑。使用新的API,可以轻松处理时区,使用本地和带时区的日期/时间API。

Java 8中的新日期时间API

新的日期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:它表示时间线上的一纳秒起点(自纪元以来),并且用于生成表示机器时间的时间戳。发生在纪元之前的瞬间具有负值,而发生在纪元之后的瞬间具有正值。

java.time.Duration:它表示两个瞬间之间的差异,以秒或纳秒为单位,并且不使用基于日期的构造,如年、月和日,尽管该类提供了转换为天、小时和分钟的方法。

java.time.Period:它用于定义日期之间的差异,以基于日期的值(年、月、日)为单位。

java.time.ZoneId:它表示一个时区标识符,并提供在Instant和LocalDateTime之间进行转换的规则。

java.time.ZoneOffset:它描述与格林尼治/协调世界时的时区偏移。

java.time.format.DateTimeFormatter:它提供各种预定义的格式化程序,或者我们可以定义自己的格式化程序。它具有用于解析和格式化日期时间值的parse()或format()方法。

标签: java, Java面试题, Java下载, java教程, java技术, Java学习, Java学习教程, Java语言, Java开发, Java入门教程, Java进阶教程, Java高级教程, Java笔试题, Java编程思想