Skip to content

Java 8 引入了全新的日期时间 API,通过 java.time 包提供了更加简洁、强大的日期时间操作功能。以下是 Java 日期时间操作的详细总结,包括常用类、操作方法、格式化和解析等。

1. 常用日期时间类

1.1 LocalDate(无时区的日期)

表示没有时区的日期(如:2025-01-13)。常用于日历日期处理。

  • now():获取当前日期
  • of(int year, int month, int dayOfMonth):根据指定的年、月、日创建一个 LocalDate
  • plusDays(long days):加指定天数
  • minusDays(long days):减指定天数
  • getYear()getMonth()getDayOfMonth():获取年、月、日
  • isBefore()isAfter()isEqual():比较日期

1.2 LocalTime(无时区的时间)

表示没有时区的时间(如:14:30)。常用于表示时间(小时、分钟、秒)。

  • now():获取当前时间
  • of(int hour, int minute, int second):根据指定小时、分钟、秒创建一个 LocalTime
  • plusHours(long hours)plusMinutes(long minutes):加指定时间
  • minusHours(long hours)minusMinutes(long minutes):减指定时间
  • getHour()getMinute()getSecond():获取小时、分钟、秒
  • isBefore()isAfter()isEqual():比较时间

1.3 LocalDateTime(无时区的日期时间)

LocalDateTimeLocalDateLocalTime 的组合,表示不包含时区的日期和时间。

  • now():获取当前日期和时间
  • of(int year, int month, int dayOfMonth, int hour, int minute):创建指定日期和时间
  • plusDays(long days)plusHours(long hours):加指定的天数或小时
  • minusDays(long days)minusHours(long hours):减指定的天数或小时
  • getYear()getMonth()getDayOfMonth()getHour()getMinute():获取年、月、日、时、分
  • isBefore()isAfter()isEqual():比较日期和时间

1.4 ZonedDateTime(带时区的日期时间)

ZonedDateTime 是包含时区的日期时间,适用于处理跨时区的日期时间。

  • now():获取当前时区的日期时间
  • of(int year, int month, int dayOfMonth, int hour, int minute, int second, int nanoOfSecond, ZoneId zone):创建带时区的日期时间
  • withZoneSameInstant(ZoneId zone):将时间转换为不同的时区
  • plusDays(long days)minusHours(long hours):加减日期时间
  • getZone():获取时区信息

1.5 Instant(时间戳)

Instant 代表从1970年1月1日00:00:00 UTC到某个时间的秒数和纳秒数,适用于存储和比较精确的时间。

  • now():获取当前时间的时间戳
  • ofEpochSecond(long epochSecond):根据秒数创建 Instant
  • plusSeconds(long seconds)minusSeconds(long seconds):加减秒数
  • toEpochMilli():将 Instant 转换为毫秒时间戳

2. 日期时间格式化与解析

2.1 DateTimeFormatter

DateTimeFormatter 用于日期时间的格式化和解析。可以根据指定的模式格式化日期时间,也可以解析字符串为日期时间对象。

  • ofPattern(String pattern):指定格式模式
  • format(TemporalAccessor temporal):格式化日期时间
  • parse(CharSequence text):将字符串解析为日期时间
  • parse(CharSequence text, DateTimeFormatter formatter):指定格式解析字符串为日期时间

常见格式模式

  • yyyy:四位年份
  • MM:两位月份
  • dd:两位日期
  • HH:两位小时(24小时制)
  • mm:两位分钟
  • ss:两位秒
  • yyyy-MM-dd:日期格式(如:2025-01-13)
  • HH:mm:ss:时间格式(如:14:30:00)

示例

java
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

public class DateTimeFormatterExample {
    public static void main(String[] args) {
        LocalDate date = LocalDate.now();

        // 格式化日期
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        String formattedDate = date.format(formatter);
        System.out.println("格式化后的日期:" + formattedDate);

        // 解析日期
        String dateString = "2025-01-13";
        LocalDate parsedDate = LocalDate.parse(dateString, formatter);
        System.out.println("解析后的日期:" + parsedDate);
    }
}

3. 日期时间加减操作

Java 8 提供了多种日期时间加减的方法:

  • plusDays(long days):加指定天数
  • minusDays(long days):减指定天数
  • plusMonths(long months):加指定月数
  • minusMonths(long months):减指定月数
  • plusYears(long years):加指定年数
  • minusYears(long years):减指定年数
  • plusHours(long hours):加指定小时
  • minusHours(long hours):减指定小时

示例

java
import java.time.LocalDateTime;

public class DateTimeAddSubtract {
    public static void main(String[] args) {
        LocalDateTime dateTime = LocalDateTime.now();

        // 加一周
        LocalDateTime nextWeek = dateTime.plusWeeks(1);
        System.out.println("一周后的日期和时间:" + nextWeek);

        // 减一个月
        LocalDateTime previousMonth = dateTime.minusMonths(1);
        System.out.println("上个月的日期和时间:" + previousMonth);
    }
}

4. 日期时间比较

Java 提供了多种方法比较日期和时间:

  • isBefore():判断日期/时间是否早于指定的日期/时间
  • isAfter():判断日期/时间是否晚于指定的日期/时间
  • isEqual():判断日期/时间是否相等
  • compareTo():比较日期时间的先后顺序

示例

java
import java.time.LocalDateTime;

public class DateTimeComparison {
    public static void main(String[] args) {
        LocalDateTime dateTime1 = LocalDateTime.of(2025, 1, 13, 10, 30);
        LocalDateTime dateTime2 = LocalDateTime.of(2025, 1, 14, 10, 30);

        System.out.println("dateTime1 是否早于 dateTime2? " + dateTime1.isBefore(dateTime2));
        System.out.println("dateTime1 是否晚于 dateTime2? " + dateTime1.isAfter(dateTime2));
        System.out.println("dateTime1 是否等于 dateTime2? " + dateTime1.isEqual(dateTime2));
    }
}

5. 时区转换

使用 ZonedDateTime 类可以实现不同时区之间的转换。例如,将当前时区的时间转换为其他时区的时间。

示例

java
import java.time.ZonedDateTime;
import java.time.ZoneId;

public class TimeZoneConversion {
    public static void main(String[] args) {
        ZonedDateTime utcTime = ZonedDateTime.now(ZoneId.of("UTC"));
        System.out.println("UTC 时间:" + utcTime);

        ZonedDateTime tokyoTime = utcTime.withZoneSameInstant(ZoneId.of("Asia/Tokyo"));
        System.out.println("东京时间:" + tokyoTime);
    }
}

6. Instant 时间戳操作

Instant 是精确到秒和纳秒的时间戳,通常用于存储和比较具体的时间。

  • now():获取当前时间戳
  • ofEpochSecond(long epochSecond):根据秒数创建时间戳
  • toEpochMilli():获取毫秒级的时间戳
  • plusSeconds(long seconds):加秒数
  • minusSeconds(long seconds):减秒数

示例

java
import java.time.Instant;

public class InstantExample {
    public static void main(String[] args) {
        Instant instant = Instant.now();
        System.out.println("当前时间戳:" + instant);

        long epochSecond = instant.getEpochSecond();
        System.out.println("当前秒级时间戳:" + epochSecond);
    }
}

Released under the MIT License.