Java 日期时间
Java 提供了多种处理日期和时间的方式,最常用的方式是在 java.util 包中的 Date 类、Calendar 类,以及在 Java 8 引入的新的日期和时间 API (java.time 包),它们更为现代且功能更加强大。
1. java.util.Date 类
Date 类是 Java 最早的日期时间处理类。它表示一个特定的瞬间,精确到毫秒。
1.1 创建 Date 对象
// 创建当前日期时间对象
Date date1 = new Date();
System.out.println(date1); // 输出当前日期和时间
// 创建指定时间的 Date 对象
long timestamp = 1652345678900L; // 毫秒表示的时间戳
Date date2 = new Date(timestamp);
System.out.println(date2); // 输出指定时间
1.2 获取时间戳
Date 类可以通过 getTime() 方法获取自 1970-01-01 00:00:00 UTC 以来的毫秒数(Unix 时间戳)。
Date date = new Date();
long timestamp = date.getTime();
System.out.println("当前时间戳: " + timestamp);
1.3 Date 类常用方法
getTime(): 获取当前日期的时间戳。before(): 判断当前日期是否早于指定日期。after(): 判断当前日期是否晚于指定日期。equals(): 比较两个日期是否相等。
Date date1 = new Date();
Thread.sleep(1000); // 暂停 1 秒
Date date2 = new Date();
System.out.println(date1.before(date2)); // 输出 true,因为 date1 在 date2 之前
2. java.util.Calendar 类
Calendar 类提供了更多的日期操作方法,允许更细粒度的操作,如获取年份、月份、天数等。
2.1 创建 Calendar 对象
Calendar calendar = Calendar.getInstance(); // 获取当前日期和时间
System.out.println(calendar.getTime()); // 输出当前日期和时间
2.2 获取年份、月份等
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH); // 月份从 0 开始,0 表示 1 月
int day = calendar.get(Calendar.DAY_OF_MONTH);
int hour = calendar.get(Calendar.HOUR_OF_DAY); // 获取 24 小时制的小时
int minute = calendar.get(Calendar.MINUTE);
int second = calendar.get(Calendar.SECOND);
System.out.println("当前年份: " + year);
System.out.println("当前月份: " + (month + 1)); // 由于月份从 0 开始,输出时加 1
2.3 修改日期时间
calendar.add(Calendar.DATE, 5); // 当前日期加 5 天
System.out.println("5 天后: " + calendar.getTime());
calendar.add(Calendar.MONTH, -1); // 当前日期减去 1 个月
System.out.println("1 个月前: " + calendar.getTime());
3. java.time 包(Java 8+)
Java 8 引入了新的日期时间 API,java.time 包为日期时间的处理提供了更强大的功能,并且是线程安全的。它由多个类组成,主要的类有:
LocalDate: 只表示日期(年、月、日)LocalTime: 只表示时间(时、分、秒、纳秒)LocalDateTime: 同时表示日期和时间(年、月、日、时、分、秒、纳秒)ZonedDateTime: 表示带时区的日期时间Instant: 表示时间戳(从纪元开始的秒数)
3.1 创建 LocalDate 和 LocalTime
// 创建当前日期
LocalDate today = LocalDate.now();
System.out.println("今天的日期: " + today);
// 创建当前时间
LocalTime now = LocalTime.now();
System.out.println("当前时间: " + now);
3.2 创建 LocalDateTime(日期和时间)
// 创建当前日期和时间
LocalDateTime nowDateTime = LocalDateTime.now();
System.out.println("当前日期和时间: " + nowDateTime);
// 创建指定日期和时间
LocalDateTime specificDateTime = LocalDateTime.of(2023, 3, 1, 14, 30);
System.out.println("指定日期和时间: " + specificDateTime);
3.3 LocalDateTime 的常用操作
LocalDateTime nowDateTime = LocalDateTime.now();
// 增加 2 天
LocalDateTime futureDate = nowDateTime.plusDays(2);
System.out.println("2 天后: " + futureDate);
// 减去 1 个月
LocalDateTime pastDate = nowDateTime.minusMonths(1);
System.out.println("1 个月前: " + pastDate);
// 获取年份、月份、日期、小时、分钟
int year = nowDateTime.getYear();
int month = nowDateTime.getMonthValue();
int day = nowDateTime.getDayOfMonth();
int hour = nowDateTime.getHour();
int minute = nowDateTime.getMinute();
System.out.println("年份: " + year);
System.out.println("月份: " + month);
System.out.println("日期: " + day);
System.out.println("小时: " + hour);
System.out.println("分钟: " + minute);
3.4 ZonedDateTime 和时区
ZonedDateTime 用于表示带时区的日期和时间。
// 获取当前带时区的日期和时间
ZonedDateTime zonedDateTime = ZonedDateTime.now();
System.out.println("当前带时区的日期和时间: " + zonedDateTime);
// 获取指定时区的日期和时间
ZoneId zoneId = ZoneId.of("Asia/Shanghai");
ZonedDateTime zoneDateTime = ZonedDateTime.now(zoneId);
System.out.println("上海时区的当前日期和时间: " + zoneDateTime);
3.5 Instant(时间戳)
Instant 是 Java 8 中用于表示时间戳的类,它可以表示从 Unix 纪元(1970-01-01T00:00:00Z)开始的秒数。
// 获取当前时间的时间戳
Instant nowInstant = Instant.now();
System.out.println("当前时间戳: " + nowInstant);
// 获取当前时间戳的毫秒数
long timestamp = nowInstant.toEpochMilli();
System.out.println("当前时间戳(毫秒): " + timestamp);
3.6 格式化和解析日期时间
DateTimeFormatter 是 Java 8 中用于格式化和解析日期时间的类。
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime dateTime = LocalDateTime.now();
String formattedDate = dateTime.format(formatter);
System.out.println("格式化日期和时间: " + formattedDate);
// 解析字符串为日期
String dateStr = "2023-03-01 14:30:00";
LocalDateTime parsedDate = LocalDateTime.parse(dateStr, formatter);
System.out.println("解析后的日期和时间: " + parsedDate);
4. 日期时间的比较
Java 提供了方法来比较两个日期时间对象。
LocalDateTime dateTime1 = LocalDateTime.of(2023, 3, 1, 14, 30);
LocalDateTime dateTime2 = LocalDateTime.of(2023, 3, 2, 14, 30);
boolean isBefore = dateTime1.isBefore(dateTime2);
boolean isAfter = dateTime1.isAfter(dateTime2);
boolean isEqual = dateTime1.isEqual(dateTime2);
System.out.println("dateTime1 是否早于 dateTime2: " + isBefore); // true
System.out.println("dateTime1 是否晚于 dateTime2: " + isAfter); // false
System.out.println("dateTime1 是否等于 dateTime2: " + isEqual); // false
5. 总结
java.util.Date:早期的日期类,功能有限,已经不推荐使用。java.util.Calendar:提供更多的日期操作功能,但使用起来稍显复杂。java.time:Java 8 引入的新日期时间 API,更现代,功能强大且线程安全,推荐使用。LocalDate:表示日期(无时间)。LocalTime:表示时间(无日期)。LocalDateTime:表示日期和时间。ZonedDateTime:表示带时区的日期和时间。Instant:表示自纪元以来的时间戳。DateTimeFormatter:用于格式化和解析日期时间。
Java 8 及之后版本推荐使用 java.time 包来处理日期和时间,它提供了更清晰、更易用的 API。
如果
更多详细内容请关注其他相关文章!