教程中心 / Java教程 / LocalDateTime

LocalDateTime

12分钟 日期时间

LocalDate、LocalTime、LocalDateTime详解

这三个类是Java 8日期时间API的核心,它们分别处理日期、时间和日期时间。不可变且线程安全

三者关系

LocalDate = "2026年6月15日"(日历上的一个日期)
LocalTime = "14:30:00"(手表上的一个时刻)
LocalDateTime = "2026年6月15日 14:30:00"(日程表上的一个时间点)

LocalDate - 日期处理

创建LocalDate

import java.time.LocalDate;

public class LocalDateDemo {
    public static void main(String[] args) {
        // 获取当前日期
        LocalDate today = LocalDate.now();
        System.out.println("今天: " + today);  // 2026-06-15

        // 创建指定日期 - 直观易懂!
        LocalDate birthday = LocalDate.of(2000, 1, 1);   // 2000年1月1日
        LocalDate christmas = LocalDate.of(2026, 12, 25); // 2026年12月25日

        // 从字符串解析(ISO格式)
        LocalDate parsed = LocalDate.parse("2026-06-15");
        System.out.println("解析: " + parsed);

        // 使用plus/minus计算日期
        LocalDate nextWeek = today.plusWeeks(1);
        LocalDate lastMonth = today.minusMonths(1);
        LocalDate nextYear = today.plusYears(1);
        System.out.println("一周后: " + nextWeek);
        System.out.println("一月前: " + lastMonth);

        // 获取日期组成部分
        System.out.println("年: " + today.getYear());
        System.out.println("月: " + today.getMonthValue());  // 6(不是0开始的!)
        System.out.println("日: " + today.getDayOfMonth());
        System.out.println("星期: " + today.getDayOfWeek()); // FRIDAY
        System.out.println("一年中的第几天: " + today.getDayOfYear());

        // 判断
        System.out.println("是否闰年: " + today.isLeapYear());
        System.out.println("是否周末: " + (today.getDayOfWeek().getValue() > 5));
    }
}

LocalTime - 时间处理

创建LocalTime

import java.time.LocalTime;

public class LocalTimeDemo {
    public static void main(String[] args) {
        // 获取当前时间
        LocalTime now = LocalTime.now();
        System.out.println("现在: " + now);  // 14:30:15.123456

        // 创建指定时间
        LocalTime noon = LocalTime.of(12, 0);           // 中午12:00
        LocalTime afternoon = LocalTime.of(14, 30, 15); // 下午2:30:15
        LocalTime midnight = LocalTime.of(0, 0, 0);     // 午夜

        // 从字符串解析
        LocalTime parsed = LocalTime.parse("14:30:00");

        // 使用plus/minus计算时间
        LocalTime later = now.plusHours(2);
        LocalTime earlier = now.minusMinutes(30);
        System.out.println("两小时后: " + later);

        // 获取时间组成部分
        System.out.println("时: " + now.getHour());
        System.out.println("分: " + now.getMinute());
        System.out.println("秒: " + now.getSecond());
        System.out.println("纳秒: " + now.getNano());

        // 时间比较
        LocalTime deadline = LocalTime.of(17, 0);
        System.out.println("现在在截止时间之前: " + now.isBefore(deadline));
    }
}

LocalDateTime - 日期时间处理

创建LocalDateTime

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;

public class LocalDateTimeDemo {
    public static void main(String[] args) {
        // 获取当前日期时间
        LocalDateTime now = LocalDateTime.now();
        System.out.println("当前: " + now);  // 2026-06-15T14:30:00

        // 方法1:直接指定
        LocalDateTime dt1 = LocalDateTime.of(2026, 6, 15, 10, 30);
        LocalDateTime dt2 = LocalDateTime.of(2026, 6, 15, 10, 30, 15);
        LocalDateTime dt3 = LocalDateTime.of(2026, 6, 15, 10, 30, 15, 123456789);

        // 方法2:日期 + 时间
        LocalDate date = LocalDate.of(2026, 6, 15);
        LocalTime time = LocalTime.of(10, 30);
        LocalDateTime dt4 = LocalDateTime.of(date, time);
        System.out.println("组合: " + dt4);

        // 方法3:从字符串解析
        LocalDateTime parsed = LocalDateTime.parse("2026-06-15T10:30:00");

        // 加减运算
        System.out.println("加一天: " + now.plusDays(1));
        System.out.println("减两小时: " + now.minusHours(2));
        System.out.println("加一年减一天: " + now.plusYears(1).minusDays(1));

        // with方法 - 直接设置值
        System.out.println("设置小时为12: " + now.withHour(12));
        System.out.println("设置月初: " + now.withDayOfMonth(1));
    }
}

日期时间格式化

DateTimeFormatter - 强大的格式化工具

import java.time.*;
import java.time.format.*;

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

        // 使用预定义格式
        DateTimeFormatter iso = DateTimeFormatter.ISO_DATE_TIME;
        System.out.println("ISO格式: " + now.format(iso));

        // 自定义格式
        DateTimeFormatter f1 = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        DateTimeFormatter f2 = DateTimeFormatter.ofPattern("HH:mm:ss");
        DateTimeFormatter f3 = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss");
        DateTimeFormatter f4 = DateTimeFormatter.ofPattern("EEEE");

        System.out.println("日期: " + now.format(f1));
        System.out.println("时间: " + now.format(f2));
        System.out.println("中文: " + now.format(f3));
        System.out.println("星期: " + now.format(f4));  // 星期六

        // 解析字符串
        LocalDate date = LocalDate.parse("2026-06-15", f1);
        LocalDateTime dt = LocalDateTime.parse("2026-06-15 10:30:00",
            DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
        System.out.println("解析日期: " + date);
        System.out.println("解析日期时间: " + dt);
    }
}

常用格式化符号

符号含义示例
y2026
MM月(两位)06
MMM月(英文缩写)Jun
dd日(两位)15
HH24小时制14
hh12小时制02
mm分钟30
ss45
EEEE星期几(完整)Saturday
a上午/下午PM

日期时间比较

import java.time.LocalDate;

public class DateCompareDemo {
    public static void main(String[] args) {
        LocalDate d1 = LocalDate.of(2026, 1, 1);
        LocalDate d2 = LocalDate.of(2026, 6, 15);
        LocalDate d3 = LocalDate.of(2026, 1, 1);

        // 比较方法
        System.out.println("d1在d2之前: " + d1.isBefore(d2));   // true
        System.out.println("d1在d2之后: " + d1.isAfter(d2));    // false
        System.out.println("d1等于d3: " + d1.isEqual(d3));     // true

        // 判断是否在某个范围内
        LocalDate start = LocalDate.of(2026, 1, 1);
        LocalDate end = LocalDate.of(2026, 12, 31);
        LocalDate check = LocalDate.of(2026, 6, 15);

        boolean inRange = !check.isBefore(start) && !check.isAfter(end);
        System.out.println("在范围内: " + inRange);  // true
    }
}

时间戳Instant

Instant表示从1970-01-01T00:00:00Z(UTC时间)开始经过的秒数和纳秒数,适合机器处理。

import java.time.Instant;

public class InstantDemo {
    public static void main(String[] args) {
        // 获取当前时间戳
        Instant now = Instant.now();
        System.out.println("当前时间戳: " + now);
        System.out.println("秒数: " + now.getEpochSecond());
        System.out.println("纳秒: " + now.getNano());

        // 从秒数创建
        Instant fromEpoch = Instant.ofEpochSecond(1712345678);
        Instant fromEpochMilli = Instant.ofEpochMilli(1712345678905L);

        // 时间戳运算
        Instant later = now.plusSeconds(3600);  // 一小时后
        Instant before = now.minusSeconds(3600); // 一小时前

        // 与LocalDateTime互转(需要时区)
        java.time.ZonedDateTime zdt = now.atZone(java.time.ZoneId.systemDefault());
        System.out.println("转为带时区: " + zdt);
    }
}

小结

  • LocalDate:只处理日期(年月日),适合生日、到期日
  • LocalTime:只处理时间(时分秒),适合定时任务
  • LocalDateTime:处理完整的日期时间,适合大多数场景
  • DateTimeFormatter:强大的格式化工具,支持自定义格式
  • isBefore/isAfter:安全的日期比较方式
  • Instant:机器友好的时间戳,适合日志和持久化
☕ Java 在线代码编辑器
📝 运行结果