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>
<ul>
<li>Date date = new Date(); // 或任意已存在的Date对象</li>
<li>Calendar cal = Calendar.getInstance();</li>
<li>cal.setTime(date); // 时间信息就加载进去了</li>
</ul>
<H3>注意时区影响</H3>
<p>Calendar默认使用JVM本地时区。如果Date代表UTC时间,而Calendar按本地时区解析,get(Calendar.HOUR_OF_DAY)等结果可能和预期不符。</p>
<ul>
<li>想让Calendar也按UTC处理:cal.setTimeZone(TimeZone.getTimeZone("UTC"));</li>
<li>建议在setTime前设置好时区,避免隐式转换出错</li>
</ul>
<H3>替代方案:构造时指定(Java 8+推荐)</H3>
<p>Calendar已属遗留API。现代写法更推荐用LocalDateTime、ZonedDateTime配合Instant:</p>
<ul>
<li>Instant instant = date.toInstant();</li>
<li>ZonedDateTime zdt = instant.atZone(ZoneId.systemDefault());</li>
<li>// 或指定时区:instant.atZone(ZoneId.of("Asia/Shanghai"))</li>
</ul>
<p>这样逻辑更清晰,时区意图明确,不易出错。</p>