calendar的settime()方法将date对象的毫秒时间值同步到calendar实例的时间戳中,后续get操作基于该时间戳计算;需注意时区影响,建议settime前设置时区;java 8+推荐使用instant和zoneddatetime替代。

<p>Java中用Calendar的setTime()方法从Date对象加载时间,就是把Date里封装的时间值(毫秒数)赋给Calendar实例。</p> <h3>setTime()的作用是同步时间值</h3> <p>Calendar本身不直接存年月日时分秒,而是内部维护一个long类型的毫秒时间戳(类似Date)。调用setTime(Date)时,Calendar会读取Date对象的getTime()返回值,更新自己的时间戳,后续get操作(如get(Calendar.YEAR))就基于这个新时间计算。</p> <h3>基本写法很简单</h3> <p>只需两步:创建Calendar实例,再调用setTime传入Date。</p><div class="aritcle_card flexRow artxards"> <div class="artcardd flexRow"> <a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill7672" title="java-enterprise"><img src="https://img.php.cn/upload/skill/000/000/081/179161929545163.jpg" alt="java-enterprise" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a> <div class="aritcle_card_info flexColumn"> <a rel="nofollow" href="/xiazai/skill7672" title="java-enterprise" class="overflowclass">java-enterprise</a> <p class="overflowclass">Java企业开发专家,专注于Spring Boot、微服务架构和JVM优化。适用于:Java语言掌握、</p> </div> <a rel="nofollow" href="/xiazai/skill7672" title="java-enterprise" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a> </div> </div>
- Date date = new Date(); // 或任意已存在的Date对象
- Calendar cal = Calendar.getInstance();
- cal.setTime(date); // 时间信息就加载进去了
注意时区影响
Calendar默认使用JVM本地时区。如果Date代表UTC时间,而Calendar按本地时区解析,get(Calendar.HOUR_OF_DAY)等结果可能和预期不符。
- 想让Calendar也按UTC处理:cal.setTimeZone(TimeZone.getTimeZone("UTC"));
- 建议在setTime前设置好时区,避免隐式转换出错
替代方案:构造时指定(Java 8+推荐)
Calendar已属遗留API。现代写法更推荐用LocalDateTime、ZonedDateTime配合Instant:
- Instant instant = date.toInstant();
- ZonedDateTime zdt = instant.atZone(ZoneId.systemDefault());
- // 或指定时区:instant.atZone(ZoneId.of("Asia/Shanghai"))
这样逻辑更清晰,时区意图明确,不易出错。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










