Java 日期时间
                           
天天向上
发布: 2025-03-02 10:30:37

原创
52 人浏览过

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 创建 LocalDateLocalTime

// 创建当前日期
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。

如果

更多详细内容请关注其他相关文章!

发表回复 0

Your email address will not be published. Required fields are marked *