Java常用时间API
Java中有多种日期和时间API,随着时间的发展,这些API经历了改进和扩展。以下是对Java中主要日期和时间API的总结:
旧版日期时间API:
java.util.Date
:表示特定的瞬时时间,精确到毫秒,但不包含任何时区信息,实际上它包含了格林威治时间(UTC)的瞬时点。java.sql.Date
:专门用于SQL语句操作日期,不包含时间部分。java.util.Calendar
:这是一个抽象类,提供了更复杂的日期和时间操作,比如获取/设置日期字段、计算日期间隔等。java.text.SimpleDateFormat
:用于日期和时间的格式化和解析,基于模式字符串。
新版日期时间API (Java 8 及以后版本):
位于 java.time
包下,设计得更为合理和强大,解决了旧版API的许多问题:
-
日期类:
-
LocalDate
:只包含年、月、日信息,不包含时间或时区。 -
LocalTime
:只包含小时、分钟、秒和纳秒信息,无日期和时区。 -
LocalDateTime
:结合了日期和时间信息,依然没有时区概念。
-
-
带时区类:
-
ZonedDateTime
:包含日期、时间以及具体的时区信息。 -
OffsetDateTime
:带有偏移量(相对于UTC的时间差)的时间戳。 -
OffsetTime
:带有偏移量的时间。
-
-
时间段和持续时间类:
-
Period
:用于存储和计算年、月、日之间的间隔。 -
Duration
:用于存储和计算秒和纳秒级别的持续时间。
-
-
时间点类:
-
Instant
:表示时间线上的一个瞬时点,总是关联到UTC时间。
-
-
时区类:
-
ZoneId
:表示时区ID,例如Europe/London
或America/New_York
。 -
ZoneOffset
:表示时区偏移量,例如+01:00
。
-
-
辅助类:
-
Clock
:提供获取当前时间(考虑时区)、系统默认时钟等功能。
-
-
格式化和解析类:
-
DateTimeFormatter
:用于日期时间的格式化和解析,比SimpleDateFormat
更强大且线程安全。
-
新版API的所有类都是不可变的,这使得它们更加线程安全并易于进行复合操作。同时,这些类提供了丰富的方法用于比较、调整、加减日期时间等操作。
以下是Java 8新日期时间API中一些常用的类及其方法:
LocalDate
- 创建实例:
LocalDate.now()
(获取当前日期),LocalDate.of(year, month, dayOfMonth)
(指定日期创建) - 获取日期字段:
getYear()
,getMonthValue()
,getDayOfMonth()
- 操作日期:
plusDays(days)
,minusWeeks(weeks)
,withDayOfMonth(dayOfMonth)
- 判断日期关系:
isBefore(date)
,isAfter(date)
,isEqual(date)
LocalTime
- 创建实例:
LocalTime.now()
(获取当前时间),LocalTime.of(hour, minute, second, nanoOfSecond)
(指定时间创建) - 获取时间字段:
getHour()
,getMinute()
,getSecond()
,getNano()
- 操作时间:
plusHours(hours)
,minusMinutes(minutes)
,withSecond(second)
LocalDateTime
- 创建实例:
LocalDateTime.now()
(获取当前日期时间),LocalDateTime.of(LocalDate, LocalTime)
(组合日期和时间创建) - 转换为日期或时间:
toLocalDate()
,toLocalTime()
- 操作日期时间:
plusDays(days)
,minusHours(hours)
,atZone(zone)
(转换为ZonedDateTime)
ZonedDateTime
- 创建实例:
ZonedDateTime.now(ZoneId.systemDefault())
(获取当前时区日期时间),ZonedDateTime.of(LocalDate, LocalTime, ZoneId)
- 获取时区:
getZone()
- 转换为其他类型:
toLocalDateTime()
,toInstant()
- 操作日期时间:
plusMonths(months)
,minusDays(days)
,withZoneSameInstant(zone)
Duration
和 Period
- 创建实例:
Duration.between(startTime, endTime)
(计算两个时间点之间的时间间隔),Period.between(startDate, endDate)
(计算两个日期之间的日期间隔) - 获取值:
getSeconds()
,getMinutes()
,getHours()
,getDays()
,getMonths()
,getYears()
- 操作间隔:
plus(duration)
,minus(period)
DateTimeFormatter
- 格式化:
format(localDateTime)
(将日期时间对象转换为格式化字符串) - 解析:
parse(string)
(将格式化的字符串解析为日期时间对象)
以上只是简单的示例,实际使用时应根据业务需求选择合适的方法。在处理日期时间相关的问题时,务必注意时区问题,确保结果符合预期。