Java 日期时间
LocalDate/LocalDateTime、DateTimeFormatter 与旧版 Date 的用法。
LocalDate / LocalDateTime
LocalDate holds a date, LocalTime a time, LocalDateTime both. All are immutable: methods like plusDays return a new instance rather than mutating.
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);
}
}2024-10-31
12:30:15
2024-10-31T12:30:15
2024-10-31
2024-11-01
2024-10-31DateTimeFormatter
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.
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));
}
}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.
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());
}
}2024-02-29
2025-02-28
true
2
WEDNESDAYDate 类(旧版)
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.
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());
}
}0
true
1970-01-01T00:00:00ZLocalDate / LocalDateTime
LocalDate 只有年月日,LocalTime 只有时分秒,LocalDateTime 两者都有。它们都是不可变对象,plusDays 这类方法返回新实例而不是修改自己。
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);
}
}2024-10-31
12:30:15
2024-10-31T12:30:15
2024-10-31
2024-11-01
2024-10-31DateTimeFormatter
DateTimeFormatter.ofPattern 自定义格式:yyyy 年、MM 月、dd 日、HH 24 小时、mm 分、ss 秒。format 把日期转字符串,parse 反过来。
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));
}
}2024-10-31
2024年10月31日
2024-01-05日期计算
plusDays / minusMonths 做加减,isBefore / isAfter 比较先后,ChronoUnit.DAYS.between 算间隔。跨月跨年由库自动处理,不用自己判断闰年。
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());
}
}2024-02-29
2025-02-28
true
2
WEDNESDAYDate 类(旧版)
java.util.Date 表示一个时间戳(毫秒),getTime() 取毫秒值。它的年份从 1900 起算、月份从 0 起算,坑很多,新代码请直接用 java.time。
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());
}
}0
true
1970-01-01T00:00:00Z