Java 日期时间

LocalDate/LocalDateTime、DateTimeFormatter 与旧版 Date 的用法。

Intermediate
Key PointsJava 8 起用 java.time:LocalDate/LocalTime/LocalDateTime 不可变且线程安全;旧 Date/Calendar 可变、线程不安全,新代码不要用。

LocalDate / LocalDateTime

LocalDate holds a date, LocalTime a time, LocalDateTime both. All are immutable: methods like plusDays return a new instance rather than mutating.

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

public class TimeDemo {
    public static void main(String[] args) {
        LocalDate d = LocalDate.of(2024, 10, 31);
        LocalTime t = LocalTime.of(12, 30, 15);
        LocalDateTime dt = LocalDateTime.of(d, t);

        System.out.println(d);
        System.out.println(t);
        System.out.println(dt);
        System.out.println(d.getYear() + "-" + d.getMonthValue() + "-" + d.getDayOfMonth());
        System.out.println(d.plusDays(1));
        System.out.println(d);
    }
}
Output
2024-10-31
12:30:15
2024-10-31T12:30:15
2024-10-31
2024-11-01
2024-10-31

DateTimeFormatter

DateTimeFormatter.ofPattern builds a custom format: yyyy year, MM month, dd day, HH 24-hour, mm minute, ss second. format renders text, parse reads it back.

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

public class FormatDemo {
    public static void main(String[] args) {
        LocalDate d = LocalDate.of(2024, 10, 31);

        DateTimeFormatter f1 = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        DateTimeFormatter f2 = DateTimeFormatter.ofPattern("yyyy年MM月dd日");

        System.out.println(d.format(f1));
        System.out.println(d.format(f2));
        System.out.println(LocalDate.parse("2024-01-05", f1));
    }
}
Output
2024-10-31
2024年10月31日
2024-01-05

日期计算

plusDays / minusMonths shift dates, isBefore / isAfter compare, and ChronoUnit.DAYS.between measures a gap. Month and year boundaries are handled for you, leap years included.

Java
import java.time.LocalDate;
import java.time.temporal.ChronoUnit;

public class CalcDemo {
    public static void main(String[] args) {
        LocalDate a = LocalDate.of(2024, 2, 28);
        LocalDate b = LocalDate.of(2024, 3, 1);

        System.out.println(a.plusDays(1));
        System.out.println(a.plusYears(1));
        System.out.println(a.isBefore(b));
        System.out.println(ChronoUnit.DAYS.between(a, b));
        System.out.println(a.getDayOfWeek());
    }
}
Output
2024-02-29
2025-02-28
true
2
WEDNESDAY

Date 类(旧版)

java.util.Date is a millisecond timestamp; getTime() returns it. Its year starts at 1900 and its month at 0 — full of traps. New code should use java.time.

Java
import java.util.Date;

public class LegacyDate {
    public static void main(String[] args) {
        Date d = new Date(0);

        System.out.println(d.getTime());
        System.out.println(d.before(new Date()));
        System.out.println(d.toInstant().toString());
    }
}
Output
0
true
1970-01-01T00:00:00Z

Friends & Partners