java.util.Calendar类,通过
Calendar.getInstance()获取实例后,设置年、月等字段,再调用
get(Calendar.DAY_OF_MONTH)即可获取天数
Java中,获取日期的“日”信息可以通过多种方式实现,具体取决于你使用的Java版本和类库,以下是几种常见的方法:
使用java.util.Date和java.text.SimpleDateFormat
在Java 8之前,java.util.Date类是处理日期和时间的主要方式,为了获取日期的“日”信息,通常需要结合java.text.SimpleDateFormat类来格式化日期。
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateExample {
public static void main(String[] args) {
// 创建Date对象,表示当前日期和时间
Date date = new Date();
// 创建SimpleDateFormat对象,指定格式为"dd"(只获取日)
SimpleDateFormat sdf = new SimpleDateFormat("dd");
// 格式化日期,获取日
String day = sdf.format(date);
System.out.println("当前日期的日是: " + day);
}
}
输出示例:
当前日期的日是: 09
注意: java.util.Date类在Java 8之后已经被弃用,建议使用java.time包中的类。
使用java.util.Calendar
java.util.Calendar类提供了更灵活的方式来操作日期和时间,你可以使用它来获取日期的各个部分,包括年、月、日等。
import java.util.Calendar;
public class CalendarExample {
public static void main(String[] args) {
// 创建Calendar对象,并设置为当前日期和时间
Calendar calendar = Calendar.getInstance();
// 获取日期的“日”部分
int day = calendar.get(Calendar.DAY_OF_MONTH);
System.out.println("当前日期的日是: " + day);
}
}
输出示例:
当前日期的日是: 9
注意: Calendar类虽然功能强大,但使用起来相对复杂,且线程安全性较差,在Java 8之后,推荐使用java.time包中的类。

使用java.time.LocalDate (Java 8及以上)
Java 8引入了全新的日期和时间API,位于java.time包中。LocalDate类表示不带时区的日期,非常适合用于获取日期的“日”信息。
import java.time.LocalDate;
public class LocalDateExample {
public static void main(String[] args) {
// 获取当前日期的LocalDate对象
LocalDate localDate = LocalDate.now();
// 获取日期的“日”部分
int day = localDate.getDayOfMonth();
System.out.println("当前日期的日是: " + day);
}
}
输出示例:
当前日期的日是: 9
优点: LocalDate类不可变且线程安全,使用起来更加简洁和直观。java.time包还提供了丰富的日期和时间操作方法,如加减天数、比较日期等。
使用java.time.format.DateTimeFormatter (Java 8及以上)
如果你需要将日期格式化为字符串,并且只关心“日”部分,可以使用DateTimeFormatter类。
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
public class DateTimeFormatterExample {
public static void main(String[] args) {
// 获取当前日期的LocalDate对象
LocalDate localDate = LocalDate.now();
// 创建DateTimeFormatter对象,指定格式为"dd"(只获取日)
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd");
// 格式化日期,获取日
String day = localDate.format(formatter);
System.out.println("当前日期的日是: " + day);
}
}
输出示例:

当前日期的日是: 09
注意: DateTimeFormatter是线程安全的,可以重复使用,与SimpleDateFormat不同,DateTimeFormatter不会因为多线程访问而出现问题。
归纳对比
| 方法 | 类/接口 | 适用版本 | 优点 | 缺点 |
|---|---|---|---|---|
| 1 | java.util.Date + SimpleDateFormat |
Java 8以下 | 简单易用 | 已弃用,线程不安全 |
| 2 | java.util.Calendar |
Java 8以下 | 灵活强大 | 使用复杂,线程不安全 |
| 3 | java.time.LocalDate |
Java 8及以上 | 简洁直观,线程安全 | 需要Java 8及以上版本 |
| 4 | java.time.format.DateTimeFormatter |
Java 8及以上 | 线程安全,可复用 | 需要Java 8及以上版本 |
FAQs
为什么java.util.Date类在Java 8之后被弃用?
java.util.Date类在Java 8之后被弃用,主要是因为它存在以下几个问题:
- 线程不安全:
Date类的方法不是线程安全的,在多线程环境下可能会导致数据不一致。 - 设计不合理:
Date类同时表示日期和时间,导致其职责不清晰,且部分方法(如setTime)可能会破坏对象的不变性。 - 时区问题:
Date类没有明确的时区概念,容易引发时区相关的错误。
为了解决这些问题,Java 8引入了全新的日期和时间API,位于java.time包中,这些新类(如LocalDate、LocalTime、LocalDateTime)设计更加合理,且线程安全,推荐在新项目中使用。

LocalDate和LocalDateTime有什么区别?
LocalDate和LocalDateTime都是java.time包中的类,用于表示日期和时间,但它们有以下区别:
LocalDate: 只表示日期(年、月、日),不包含时间部分,适合用于只需要日期的场景,如生日、纪念日等。LocalDateTime: 同时表示日期和时间(年、月、日、时、分、秒),适合用于需要精确到时间的场景,如会议时间、日志记录等。
示例:
import java.time.LocalDate;
import java.time.LocalDateTime;
public class LocalDateVSLocalDateTime {
public static void main(String[] args) {
// 获取当前日期的LocalDate对象
LocalDate localDate = LocalDate.now();
System.out.println("LocalDate: " + localDate); // 输出: 2023-10-05
// 获取当前日期和时间的LocalDateTime对象
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println("LocalDateTime: " + localDateTime); // 输出: 2023-10-05T14:30:45.123
}
}
: 如果你只需要处理日期,使用LocalDate即可;如果需要同时处理日期和时间,则使用LocalDateTime
