目录
- Java 日期时间概述
- Java 8 及以上的日期时间 API(
java.time
) - Java 8 之前的日期时间 API(
java.util.Date
和java.util.Calendar
) - 日期格式化与解析(
DateTimeFormatter
和SimpleDateFormat
) - 时间戳(
Instant
和System.currentTimeMillis()
) - 时区处理(
ZoneId
和ZonedDateTime
) - 示例代码
- 参考资料
- 出站链接
1. Java 日期时间概述
Java 主要有两套日期时间 API:
- Java 8 及以上(推荐使用):
java.time
包提供现代化、线程安全的日期时间 API,如LocalDate
、LocalTime
、LocalDateTime
、ZonedDateTime
等。 - Java 8 之前(已过时但仍可用):
java.util.Date
和java.util.Calendar
,它们有许多缺陷,如不可变性差、易出错、线程不安全。
2. Java 8 及以上的日期时间 API(java.time
)
Java 8 引入了 java.time
包,该 API 受 Joda-Time
库启发,提供更清晰、更易用的日期时间处理方式。
LocalDate
(表示日期)
表示日期(年、月、日),不包含时间和时区信息:
import java.time.LocalDate;
public class Main {
public static void main(String[] args) {
LocalDate today = LocalDate.now();
System.out.println("今天的日期: " + today);
LocalDate specificDate = LocalDate.of(2025, 3, 23);
System.out.println("指定日期: " + specificDate);
}
}
LocalTime
(表示时间)
表示一天中的时间(时、分、秒、纳秒),不包含日期和时区:
import java.time.LocalTime;
public class Main {
public static void main(String[] args) {
LocalTime now = LocalTime.now();
System.out.println("当前时间: " + now);
LocalTime specificTime = LocalTime.of(14, 30, 0);
System.out.println("指定时间: " + specificTime);
}
}
LocalDateTime
(表示日期时间)
同时包含日期和时间:
import java.time.LocalDateTime;
public class Main {
public static void main(String[] args) {
LocalDateTime now = LocalDateTime.now();
System.out.println("当前日期时间: " + now);
LocalDateTime specificDateTime = LocalDateTime.of(2025, 3, 23, 14, 30, 0);
System.out.println("指定日期时间: " + specificDateTime);
}
}
ZonedDateTime
(带时区的日期时间)
用于表示带时区的日期时间:
import java.time.ZonedDateTime;
import java.time.ZoneId;
public class Main {
public static void main(String[] args) {
ZonedDateTime nowInUTC = ZonedDateTime.now(ZoneId.of("UTC"));
System.out.println("当前 UTC 时间: " + nowInUTC);
ZonedDateTime nowInShanghai = ZonedDateTime.now(ZoneId.of("Asia/Shanghai"));
System.out.println("当前上海时间: " + nowInShanghai);
}
}
Duration
和 Period
Duration
:用于计算两个时间点之间的间隔(秒、纳秒级)。Period
:用于计算两个日期之间的间隔(天、月、年)。
示例:
import java.time.Duration;
import java.time.LocalTime;
import java.time.Period;
import java.time.LocalDate;
public class Main {
public static void main(String[] args) {
LocalTime start = LocalTime.of(14, 0);
LocalTime end = LocalTime.of(16, 30);
Duration duration = Duration.between(start, end);
System.out.println("时间间隔: " + duration.toHours() + " 小时");
LocalDate startDate = LocalDate.of(2024, 3, 1);
LocalDate endDate = LocalDate.of(2025, 3, 1);
Period period = Period.between(startDate, endDate);
System.out.println("日期间隔: " + period.getYears() + " 年");
}
}
3. Java 8 之前的日期时间 API(java.util.Date
和 java.util.Calendar
)
使用 Date
(已过时)
import java.util.Date;
public class Main {
public static void main(String[] args) {
Date date = new Date();
System.out.println("当前日期: " + date);
}
}
使用 Calendar
import java.util.Calendar;
public class Main {
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
System.out.println("当前日期: " + calendar.getTime());
}
}
4. 日期格式化与解析(DateTimeFormatter
和 SimpleDateFormat
)
DateTimeFormatter
(Java 8 及以上)
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class Main {
public static void main(String[] args) {
LocalDateTime now = LocalDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
System.out.println("格式化日期时间: " + now.format(formatter));
}
}
SimpleDateFormat
(Java 8 之前)
import java.text.SimpleDateFormat;
import java.util.Date;
public class Main {
public static void main(String[] args) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("格式化日期时间: " + sdf.format(new Date()));
}
}
5. 时间戳(Instant
和 System.currentTimeMillis()
)
import java.time.Instant;
public class Main {
public static void main(String[] args) {
Instant timestamp = Instant.now();
System.out.println("当前时间戳: " + timestamp);
}
}
6. 时区处理(ZoneId
和 ZonedDateTime
)
import java.time.ZoneId;
import java.time.ZonedDateTime;
public class Main {
public static void main(String[] args) {
ZonedDateTime now = ZonedDateTime.now(ZoneId.of("Asia/Tokyo"));
System.out.println("东京时间: " + now);
}
}
发表回复