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
(无时区的日期时间)
LocalDateTime
是 LocalDate
和 LocalTime
的组合,表示不包含时区的日期和时间。
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);
}
}