Java中的JDK7和JDK8时间类详解

目录

一、JDK7时间类

1. Date类

2. Calendar类

3. SimpleDateFormat类

二、JDK8时间类

1. LocalDate类

2. LocalTime类

3. LocalDateTime类

4. ZoneId和时区处理

5. ZonedDateTime类

6. Instant类

7. DateTimeFormatter类

8. ChronoUnit枚举

9. Duration和Period类

10. Local类之间的关系

三、JDK7和JDK8时间类对比

四、从JDK7到JDK8的迁移

替换对应关系

转换代码示例

五、面试常见问题

总结


一、JDK7时间类

1. Date类

Date类位于java.util包中。它是 Java 早期用于表示日期和时间的类,提供了基本的时间操作功能。不过,自 Java 8 起,推荐使用java.time包中的 API(如LocalDateTimeZonedDateTime等)替代,因为它们提供了更简洁、线程安全且功能丰富的时间处理能力。

● Date类是一个JDK写好的javabean类,用来描述时间,精确到毫秒

● 利用空参构造创建的对象,默认表示系统当前时间

● 利用有参构造创建的对象,表示指定时间

构造方法说明

构造方法 说明
public Date() 创建Date对象,表示当前时间
public Date(long date) 创建Date对象,表示指定毫秒值对应的时间

常用方法说明

方法名 说明
public void setTime(long time) 设置/修改时间的毫秒值
public long getTime() 获取时间对象的毫秒值

使用示例

// 创建表示当前时间的Date对象
Date now = new Date();
System.out.println(now); // 输出如:Sun May 11 10:23:45 CST 2025

// 创建表示指定时间的Date对象(毫秒值)
Date specifiedDate = new Date(1000); // 1970年1月1日加上1000毫秒
System.out.println(specifiedDate);

// 获取Date对象的毫秒值
long timeInMillis = now.getTime();
System.out.println("毫秒值:" + timeInMillis);

2. Calendar类

Calendar类是 Java 早期用于处理日期和时间的抽象类,位于java.util包中。它提供了比Date更丰富的日历操作功能(如获取 / 设置年、月、日、时、分、秒等),但同样存在线程安全问题,Java 8 后推荐使用java.time包中的Calendar类替代。

● Calendar代表了系统当前时间的日历对象,可以单独修改、获取时间中的年,月,日

● 细节:Calendar是一个抽象类,不能直接创建对象

● 细节:

月份:范围是0~11,0代表1月

星期:在老外眼中,星期日是一个星期的第一天

即:1(星期日)2(星期一)3(星期二)4(星期三)5(星期四)6(星期五)7(星期六)

获取对象方法

方法名 说明
public static Calendar getInstance() 获取Calendar对象,默认表示当前时间

常用方法说明

方法名 说明
public int get(int field) 获取某个字段的值
public void set(int field, int value) 设置某个字段的值
public void add(int field, int amount) 为某个字段增加/减少指定量
public final Date getTime() 转换成Date对象
public long getTimeInMillis() 获取时间的毫秒值

常用字段常量

常量 说明
Calendar.YEAR
Calendar.MONTH 月(0-11)
Calendar.DAY_OF_MONTH
Calendar.HOUR 12小时制小时
Calendar.HOUR_OF_DAY 24小时制小时
Calendar.MINUTE 分钟
Calendar.SECOND
Calendar.DAY_OF_WEEK 星期几(1-7,1代表星期日)

使用示例

// 获取Calendar对象
Calendar calendar = Calendar.getInstance();

// 获取年、月、日
int year = calendar.get(Calendar.YEAR);
// 注意:月份从0开始,0代表1月,11代表12月
int month = calendar.get(Calendar.MONTH) + 1; // +1转换为人类习惯
int day = calendar.get(Calendar.DAY_OF_MONTH);
System.out.println(year + "年" + month + "月" + day + "日");

// 设置年、月、日
calendar.set(Calendar.YEAR, 2026);
calendar.set(Calendar.MONTH, 0); // 1月
calendar.set(Calendar.DAY_OF_MONTH, 1);

// 也可以一次性设置年、月、日
calendar.set(2026, 0, 1); // 2026年1月1日

// 日期计算
calendar.add(Calendar.DAY_OF_MONTH, 10); // 增加10天
calendar.add(Calendar.MONTH, -1); // 减少1个月

// 转换成Date对象
Date date = calendar.getTime();

3. SimpleDateFormat类

SimpleDateFormat 是 Java 早期用于日期格式化和解析的类,位于 java.text 包中。它允许开发者将 Date 对象格式化为字符串,或将字符串解析为 Date 对象。

● 格式化:把时间变成我们喜欢的格式

● 解析:把字符串表示的时间变成Date对象

构造方法说明

构造方法 说明
public SimpleDateFormat() 构造一个SimpleDateFormat,使用默认格式
public SimpleDateFormat(String pattern) 构造一个SimpleDateFormat,使用指定的格式

常用方法说明

方法名 说明
public final String format(Date date) 格式化(日期对象 -> 字符串)
public Date parse(String source) 解析(字符串 -> 日期对象)

常用的模式字母

字母 含义
y
M
d
H 小时(24小时制)
h 小时(12小时制)
m 分钟
s
S 毫秒
E 星期几
a 上午/下午标记

使用示例

// 创建日期对象
Date date = new Date();

// 使用默认格式化器
SimpleDateFormat defaultFormat = new SimpleDateFormat();
String defaultStr = defaultFormat.format(date);
System.out.println("默认格式:" + defaultStr); // 默认格式如:5/11/25 10:23 AM

// 自定义格式化器
SimpleDateFormat customFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
String customStr = customFormat.format(date);
System.out.println("自定义格式:" + customStr); // 如:2025年05月11日 10:23:45

// 解析字符串为日期对象
try {
    String dateStr = "2025-05-11 10:23:45";
    SimpleDateFormat parseFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    Date parsedDate = parseFormat.parse(dateStr);
    System.out.println("解析结果:" + parsedDate);
} catch (Exception e) {
    e.printStackTrace();
}

注意事项

  • SimpleDateFormat不是线程安全的,在多线程环境下应该为每个线程创建独立的实例
  • 解析时,字符串的格式必须与SimpleDateFormat的模式匹配,否则会抛出ParseException
  • 默认格式说明
    无参构造函数 SimpleDateFormat() 使用的默认格式取决于当前 Java 虚拟机的区域设置(Locale)。常见 Locale 的默认格式示例如下:

    Locale 日期默认格式 时间默认格式 日期 + 时间默认格式
    中文(中国) yyyy-M-d H:mm:ss yyyy-M-d H:mm:ss
    英文(美国) M/d/yyyy h:mm:ss a M/d/yyyy h:mm:ss a
    日文(日本) yyyy/MM/dd H:mm:ss yyyy/MM/dd H:mm:ss

二、JDK8时间类

LocalDate 是 Java 8 引入的日期处理类,位于 java.time 包中。它专注于表示日期(年、月、日),不包含时间和时区信息,具有不可变性和线程安全性。

1. LocalDate类

● LocalDate表示不带时区的日期(年月日)

● 该类是不可变的,所有的修改操作都会返回新的实例

创建对象的方法

方法名 说明
public static
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值