Java常用时间API

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/LondonAmerica/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)

DurationPeriod

  • 创建实例:Duration.between(startTime, endTime)(计算两个时间点之间的时间间隔),Period.between(startDate, endDate)(计算两个日期之间的日期间隔)
  • 获取值:getSeconds(), getMinutes(), getHours(), getDays(), getMonths(), getYears()
  • 操作间隔:plus(duration), minus(period)

DateTimeFormatter

  • 格式化:format(localDateTime)(将日期时间对象转换为格式化字符串)
  • 解析:parse(string)(将格式化的字符串解析为日期时间对象)

以上只是简单的示例,实际使用时应根据业务需求选择合适的方法。在处理日期时间相关的问题时,务必注意时区问题,确保结果符合预期。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容