Java的Date和Time入门教程

本文是一篇翻译文章,已取得原作者授权,原文地址是http://tutorials.jenkov.com/java-date-time/index.html

Java语言的JDK中关于日期和时间的API设计的不是很好,类之间的职责划分不是很清晰,初学者很可能会搞不清楚这些类的使用方法和适用场景。本教程将尝试帮助大家了解和认识一下JDK中的日期和时间相关的类,希望可以帮助大家减少对它们的误解和误用。

  实际上,在JDK8中引入了一套新的用于处理日期和时间的API。本教程将会覆盖和讲解JDK7和JDK8两套日期和时间相关的API。

JDK8中的Date和Time类

  JDK8中新引入的日期和时间API位于 java.time 包中。我们知道在JDK7中日期和时间API中,使用一个long类型的变量(可正可负)统计从1970年1月1日零点零分开始计数直到当前所经过的毫秒数。在JDK8中,时间的计数开始时间同样是1970年1月1日零点零分,不过,这次采用了一个记录秒数的long类型的变量(可正可负)加上一个记录纳秒数的int类型的变量(只能是正数)一起来表示时间。稍后,我们可以看到新的JDK8中的API是如何使用这两个变量的。
  我们注意到,在 java.time 包的下面含有子包,这些子包中含有一些很有用的工具类。比如:java.time.chrono 包包含有处理日本、*等国家和地区日历的工具类; java.time.format 包含有的类可以用来在日期、时间与字符串之间做解析和格式化的工作。
  我们先来看一下JDK8中关于日期和时间的核心类有哪些?

  • Instant :代表时间线上的一个时间点,内部使用秒数和纳秒数

  • Duration :代表一段时间,两个Instant时间点之间的时间差,内部使用秒数和纳秒数

  • LocalDate :代表不含有时区信息的日期

  • LocalDateTime :代表不含有时区信息的日期时间

  • LocalTime :代表不含有时区信息的时间

  • ZonedDateTime:代表含有时区信息的日期时间

  • DateTimeFormatter:用于日期或时间到字符串的格式化转换

JDK7中的Date和Time类

  正如前文所提,JDK7中,是使用一个long类型的变量(可正可负)统计从1970年1月1日零点零分开始计数直到当前所经过的毫秒数。我们也看一下JDK7中的关于日期和时间的核心类有哪些?

  • System.currentTimeMillis() :一个返回代表当前日期和时间的毫秒数的静态方法

  • java.util.Date:代表日期和时间的类,类中的大部分方法已过期

  • java.sql.Date:代表日期的类,用于JDBC中

  • java.sql.Timestamp:代表日期和时间的类,用于JDBC中

  • java.util.Calendar:日历的基类,含有大量操作日期和时间的方法

  • java.util.GregorianCalendar:一个日历的具体类,代表最常使用的公历日历,是Calendar的一个子类

  • java.util.TimeZone:代表时区的概念,帮助处理日历的跨时区问题

  • java.text.SimpleDateFormat:帮助处理日期、时间与字符串之间的转换

  正如你所看到的,JDK7中的日期和时间相关API的设计很不友好,多个类的之间的职责不清晰,有重叠区域存在。在实际的使用过程中,具体该使用哪个类,取决于你的具体需求。如果是很非常简单的时间记录,使用System.currentTimeMills() 就可以啦。如果你只是需要一个对象来记录一个时间值,直接使用 java.util.Date 就好。如果你需要和数据库中的日期、时间值打交道,你需要使用 java.sql.Date 或者 java.sql.Timestamp 。如果你需要对日期、时间进行一些算数上的处理,那么使用java.util.Calendar 或者 java.util.GregorianCalendar会是一个好的选择。
  本文对JDK7和JDK8中的日期、时间相关的API进行了一个大概的介绍,先让大家对整体的设计有基本的认识。接下来的教程会相对深入到具体的类和使用场景中。

本系列文档会在本人的微信公众号发布,欢迎大家扫码关注。

                Java的Date和Time入门教程

上一篇:AutoCloseable 接口| 学习笔记


下一篇:MS Project学习笔记一:安装