Java中Calendar类是处理日期时间的核心工具,通过getInstance()获取实例,set()/get()设置和获取字段,add()/roll()增减时间,getTime()/setTime()与Date转换,before()/after()/compareTo()比较时间。其与Date的关系为:Date表示时间点,Calendar是操作器,常见误区包括误用Date的废弃方法和Calendar的可变性导致的副作用。尽管Java 8推荐使用java.time(因不可变、线程安全、API直观等优势),但Calendar仍在遗留系统、旧API交互及Java 8以下版本中具有不可替代性。处理时区和夏令时时需注意:Calendar默认使用JVM时区,可通过setTimeZone()指定;能自动处理夏令时跳变,但“缺失”或“重复”时间可能引发问题,且依赖JVM时区数据库的更新。因此,在需要兼容旧环境或维护遗留代码时,掌握Calendar仍至关重要。

Java中的
Calendar
java.time
在使用
Calendar
getInstance()
Calendar
1. getInstance()
Calendar
import java.util.Calendar;
Calendar now = Calendar.getInstance();
System.out.println("当前时间: " + now.getTime());2. set()
set()
Calendar specificDate = Calendar.getInstance();
specificDate.set(2023, Calendar.DECEMBER, 25, 10, 30, 0); // 设置2023年12月25日10:30:00
System.out.println("特定日期: " + specificDate.getTime());
// 也可以单独设置某个字段
specificDate.set(Calendar.YEAR, 2024);
System.out.println("年份修改后: " + specificDate.getTime());3. get()
set()
get()
Calendar
Calendar.YEAR
Calendar.MONTH
int year = now.get(Calendar.YEAR);
int month = now.get(Calendar.MONTH) + 1; // 月份需要加1
int day = now.get(Calendar.DAY_OF_MONTH);
System.out.println("年: " + year + ", 月: " + month + ", 日: " + day);4. add()
add()
立即学习“Java免费学习笔记(深入)”;
now.add(Calendar.DAY_OF_MONTH, 7); // 增加7天
System.out.println("7天后: " + now.getTime());
now.add(Calendar.HOUR_OF_DAY, -3); // 减少3小时
System.out.println("3小时前: " + now.getTime());5. roll()
roll()
add()
Calendar tempCalendar = Calendar.getInstance();
tempCalendar.set(2023, Calendar.DECEMBER, 31);
System.out.println("原始日期: " + tempCalendar.getTime()); // 2023年12月31日
tempCalendar.roll(Calendar.MONTH, 1); // 滚动月份,年份不变
System.out.println("滚动月份后: " + tempCalendar.getTime()); // 2023年1月31日 (因为从12月滚动1个月变成了1月)6. getTime()
Calendar
java.util.Date
getTime()
java.util.Date date = now.getTime();
System.out.println("转换为Date: " + date);7. setTime()
java.util.Date
Calendar
setTime()
java.util.Date anotherDate = new java.util.Date(); // 获取当前Date
Calendar anotherCalendar = Calendar.getInstance();
anotherCalendar.setTime(anotherDate);
System.out.println("从Date设置的Calendar: " + anotherCalendar.getTime());8. before()
after()
compareTo()
Calendar
before()
after()
compareTo()
Calendar future = Calendar.getInstance();
future.add(Calendar.DAY_OF_MONTH, 1);
System.out.println("当前时间是否在未来时间之前? " + now.before(future));
System.out.println("未来时间是否在当前时间之后? " + future.after(now));
System.out.println("比较结果 (now vs future): " + now.compareTo(future)); // 应该返回-1java.util.Date
java.util.Calendar
Date
Calendar
它们之间的关系可以这样理解:
Date
Calendar
常见转换误区:
Date的API误用: 很多人会尝试直接使用
Date
getYear()
getMonth()
Date
Calendar
Calendar
get()
// 错误示范 (已废弃且有时区问题)
// Date myDate = new Date();
// System.out.println(myDate.getYear() + 1900); // 废弃方法
// 正确做法
java.util.Date myDate = new java.util.Date();
Calendar calFromDate = Calendar.getInstance();
calFromDate.setTime(myDate);
System.out.println("年份: " + calFromDate.get(Calendar.YEAR));Calendar的Mutability(可变性): 这是我个人觉得
Calendar
Calendar
Calendar
add()
set()
Calendar
Calendar original = Calendar.getInstance();
Calendar modified = original; // modified和original指向同一个对象
modified.add(Calendar.DAY_OF_MONTH, 1);
System.out.println("原始Calendar (被修改了): " + original.getTime()); // original也被修改了为了避免这种问题,当你需要基于一个
Calendar
Calendar
Calendar originalCorrect = Calendar.getInstance();
Calendar newCalendar = (Calendar) originalCorrect.clone(); // 克隆一份
// 或者
// Calendar newCalendar = Calendar.getInstance();
// newCalendar.setTime(originalCorrect.getTime());
newCalendar.add(Calendar.DAY_OF_MONTH, 1);
System.out.println("原始Calendar (未被修改): " + originalCorrect.getTime());
System.out.println("新Calendar (修改后): " + newCalendar.getTime());Java 8引入的
java.time
Date
Calendar
Calendar
java.time
Calendar
java.time
LocalDate
LocalTime
LocalDateTime
ZonedDateTime
Calendar
java.time
Month.JANUARY
plusDays()
minusHours()
Calendar
java.time
Calendar
TimeZone
java.time
ZonedDateTime
Calendar
get()
set()
int
java.time
Duration
Period
Calendar
尽管
java.time
Calendar
Calendar
java.time
Calendar
java.util.Date
java.util.Calendar
Calendar
java.time
Calendar
java.time
TemporalAdjusters
Locale
java.time
Calendar
总的来说,对于新项目或有机会重构的模块,我强烈建议拥抱
java.time
Calendar
Calendar
java.time
1. 时区设置:
Calendar
TimeZone
import java.util.Calendar;
import java.util.TimeZone;
Calendar gmtCalendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
System.out.println("GMT时间: " + gmtCalendar.getTime());
Calendar nyCalendar = Calendar.getInstance(TimeZone.getTimeZone("America/New_York"));
System.out.println("纽约时间: " + nyCalendar.getTime());
// 你也可以在创建后设置
Calendar localCalendar = Calendar.getInstance();
System.out.println("本地时间: " + localCalendar.getTime());
localCalendar.setTimeZone(TimeZone.getTimeZone("Europe/London"));
System.out.println("设置为伦敦时区后: " + localCalendar.getTime()); // 注意,getTime()返回的Date对象内部仍是UTC毫秒数,只是Calendar在格式化时会用伦敦时区规则注意:
Calendar
TimeZone
Calendar
getTime()
Date
Date
2. 夏令时(Daylight Saving Time, DST)的处理:
Calendar
Calendar
例如,在许多地区,夏令时开始时,时间会向前跳一个小时(比如凌晨2点变成凌晨3点);夏令时结束时,时间会向后跳一个小时(比如凌晨2点变成凌晨1点)。
Calendar dstStart = Calendar.getInstance(TimeZone.getTimeZone("America/New_York"));
// 设置一个夏令时开始前的时间 (假设纽约夏令时在3月第二个周日凌晨2点开始)
dstStart.set(2023, Calendar.MARCH, 12, 1, 30, 0); // 2023年3月12日1:30 AM
System.out.println("夏令时开始前: " + dstStart.getTime()); // 输出1:30 AM EST
dstStart.add(Calendar.HOUR_OF_DAY, 1); // 增加一个小时
System.out.println("增加一小时后 (跨越夏令时开始): " + dstStart.getTime()); // 可能会跳到3:30 AM EDT,而不是2:30 AM EST这里需要注意的是,
add()
add(Calendar.HOUR_OF_DAY, 1)
潜在问题和注意事项:
Calendar
Calendar
Calendar
TimeZone
getTime()
Date
DateFormat
java.time
在我看来,处理时区和夏令时是日期时间编程中最复杂的部分之一。
Calendar
java.time
ZonedDateTime
以上就是Java中Calendar类常用方法解析的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号