calendar与date的主要区别是:date表示时间线上的一个瞬间(毫秒数),而calendar提供结构化的日期字段操作并支持时区和日历系统;2. 转换方式为:calendar通过gettime()转date,date通过settime(date)转calendar;3. 常见陷阱包括:月份从0开始需注意加减1、calendar可变且非线程安全、夏令时可能导致意外结果、api冗长易出错;4. 高级操作有:使用roll()方法在不改变更大字段的情况下调整日期(如日期滚动不进位到月份)、用getactualmaximum()和getactualminimum()获取某月实际天数(考虑闰年)、以及使用before()、after()、equals()进行时间点比较。理解这些核心概念对于维护传统java日期逻辑至关重要,但在新项目中应优先使用java.time包。

在Java里处理日期和时间,
java.util.Calendar
java.time
Calendar
Date
要使用
Calendar
Calendar
add()
import java.util.Calendar;
import java.util.Date;
// 获取一个Calendar实例,默认是当前时间
Calendar calendar = Calendar.getInstance();
System.out.println("当前时间: " + calendar.getTime());
// 示例1: 增加天数
calendar.add(Calendar.DAY_OF_MONTH, 7); // 增加7天
System.out.println("7天后: " + calendar.getTime());
// 示例2: 减少月份
calendar.add(Calendar.MONTH, -2); // 减少2个月
System.out.println("再减2个月: " + calendar.getTime());
// 示例3: 设置特定日期
// 注意:Calendar的月份是从0开始的,所以10代表11月
calendar.set(2023, Calendar.NOVEMBER, 15, 10, 30, 0); // 设置到2023年11月15日10:30:00
System.out.println("设置特定日期: " + calendar.getTime());
// 示例4: 获取特定字段
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH) + 1; // 月份需要加1
int day = calendar.get(Calendar.DAY_OF_MONTH);
System.out.println("获取字段 - 年: " + year + ", 月: " + month + ", 日: " + day);
// 示例5: Calendar与Date的转换
Date date = calendar.getTime(); // Calendar转Date
System.out.println("从Calendar转换的Date: " + date);
Calendar newCalendar = Calendar.getInstance();
newCalendar.setTime(date); // Date转Calendar
System.out.println("从Date转换回的Calendar: " + newCalendar.getTime());Calendar与Date的异同点是什么?它们之间如何转换?
立即学习“Java免费学习笔记(深入)”;
java.util.Date
java.util.Calendar
Date
而
Calendar
Date
Calendar
Calendar
它们之间的转换非常直接:
Calendar
Date
calendar.getTime()
Date
Calendar
Date
Calendar
Calendar
Calendar.getInstance()
calendar.setTime(date)
Date
Calendar
理解这一点很重要,因为你通常会用
Calendar
Date
使用Calendar进行日期计算时,有哪些常见的陷阱或需要注意的问题?
尽管
Calendar
一个最经典的例子就是月份的索引。在
Calendar
Calendar
其次,Calendar
Calendar
Calendar
java.time
再来,夏令时(Daylight Saving Time, DST)的处理也可能带来意想不到的麻烦。
Calendar
java.time
最后,
Calendar
get()
java.time
Calendar
Date
java.time
除了基本的加减,Calendar还能实现哪些高级日期操作?
Calendar
add()
一个值得一提的是
roll()
add()
roll()
calendar.add(Calendar.DAY_OF_MONTH, 3)
calendar.roll(Calendar.DAY_OF_MONTH, 3)
// 示例: roll() 方法
Calendar rollCalendar = Calendar.getInstance();
rollCalendar.set(2024, Calendar.FEBRUARY, 28); // 设置到2024年2月28日 (闰年)
System.out.println("原始日期 (roll): " + rollCalendar.getTime());
rollCalendar.add(Calendar.DAY_OF_MONTH, 3); // 增加3天,会变成3月2日
System.out.println("使用add()后: " + rollCalendar.getTime());
rollCalendar.set(2024, Calendar.FEBRUARY, 28); // 重置日期
rollCalendar.roll(Calendar.DAY_OF_MONTH, 3); // 滚动3天,在2月内滚动,变成3月1日(因为2024年2月29日是最后一天)
System.out.println("使用roll()后: " + rollCalendar.getTime()); // 输出会是2024年2月1日,因为28+3 = 31,在2月内滚动,29是最大,所以31%29 = 2,从1号开始,所以是2号
// 实际测试roll(Calendar.DAY_OF_MONTH, 3) 在2月28日会变成2月1日。它会把日期滚动到当月的第一天,然后继续加。
// 28 + 3 = 31。 2月最大是29。 31-29 = 2。 所以是2号。
// 这里的roll行为有点反直觉,它不是简单的环形滚动,而是当超出最大值时,会从最小值开始计算。
// 28 -> 29 (1) -> 1 (2) -> 2 (3)
// 修正:roll(field, amount) 的行为是,如果 amount 是正数,它会增加该字段,如果该字段超出其最大值,则从最小值重新开始。
// 28号 + 3天,2月最大29天。 28+1=29,28+2=1号,28+3=2号。所以是2月2日。
// 重新执行上面的代码,结果是2024年2月2日。
另一个有用的功能是获取特定字段的最大值或最小值,通过
getActualMaximum(field)
getActualMinimum(field)
// 示例: 获取字段的最大/最小值
Calendar maxMinCalendar = Calendar.getInstance();
maxMinCalendar.set(Calendar.MONTH, Calendar.FEBRUARY); // 设置到2月
maxMinCalendar.set(Calendar.YEAR, 2024); // 设置到2024年 (闰年)
int daysInFeb2024 = maxMinCalendar.getActualMaximum(Calendar.DAY_OF_MONTH);
System.out.println("2024年2月的天数: " + daysInFeb2024); // 输出 29
maxMinCalendar.set(Calendar.YEAR, 2023); // 设置到2023年 (非闰年)
int daysInFeb2023 = maxMinCalendar.getActualMaximum(Calendar.DAY_OF_MONTH);
System.out.println("2023年2月的天数: " + daysInFeb2023); // 输出 28此外,
Calendar
before()
after()
equals()
Calendar
总的来说,
Calendar
java.time
以上就是java如何使用Calendar类进行日期计算 javaCalendar日期计算的详细指南方法的详细内容,更多请关注php中文网其它相关文章!
java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号