求教,Java里的Calendar类问题

Fzergling 2012-07-22 01:43:02
请问Calendar获取时间最终是调用的系统API还是由java自己实现的功能?请高人指教
...全文
135 5 打赏 收藏 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
skyWalker_ONLY 2012-07-22
  • 打赏
  • 举报
回复
获取的是你系统的时间。也就是jvm所在主机的时间。更深入的些就是默认情况下,取你所在时区的时间到1970年1月1日的毫秒数。这样的话即使换时区,但是偏差不变,所显示出来的时间也是正确的
brightyq 2012-07-22
  • 打赏
  • 举报
回复
看怎么看了,java api的很多类还是需要操作系统api的。Calendar也需要。
具体实现逻辑可参考源码。
MiceRice 2012-07-22
  • 打赏
  • 举报
回复
楼主这种问题,最重要的是需要掌握分析问题的方法。

那么这种问题,其实直接看看源码就知道了:

首先:Calendar 本身是 abstract 的,也即是抽象类,是无法实例化的。

那么研究下它的getInstance()函数吧:
public static Calendar getInstance(){
Calendar cal = createCalendar(TimeZone.getDefaultRef(), Locale.getDefault());
cal.sharedZone = true;
return cal;
}

继续跟踪createCalendar()函数:
private static Calendar createCalendar(TimeZone zone,
Locale aLocale)
{
// If the specified locale is a Thai locale, returns a BuddhistCalendar
// instance.
if ("th".equals(aLocale.getLanguage())
&& ("TH".equals(aLocale.getCountry()))) {
return new sun.util.BuddhistCalendar(zone, aLocale);
} else if ("JP".equals(aLocale.getVariant())
&& "JP".equals(aLocale.getCountry())
&& "ja".equals(aLocale.getLanguage())) {
return new JapaneseImperialCalendar(zone, aLocale);
}

// else create the default calendar
return new GregorianCalendar(zone, aLocale);
}



所以最终就是:GregorianCalendar,再看看其构造函数:
public GregorianCalendar(TimeZone zone, Locale aLocale) {
super(zone, aLocale);
gdate = (BaseCalendar.Date) gcal.newCalendarDate(zone);
setTimeInMillis(System.currentTimeMillis());
}
所以很清楚了,最终其实就是靠 System.currentTimeMillis(),来计算当前时间的,就是系统时间了。
XC2010_K 2012-07-22
  • 打赏
  • 举报
回复
Calendar的getTime()方法是获取你当前操作系统的时间。
你可以这样试试。
Calendar cal=new GregorianCalendar();
System.out.println(cal.getTime());
把这两句。分别在当前时间和改完系统日期之后执行。看输入的时间就可以了。
谷雨hadoop 2012-07-22
  • 打赏
  • 举报
回复
应该是系统的,java只是做了封装而已

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧