Calendar.getInstance(TimeZone.getTimeZone(“UTC”))不返回UTC时间

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (49)

我真的对我所得到的结果感到困惑。Calendar.getInstance(TimeZone.getTimeZone("UTC"))方法调用,它返回IST时间。

这是我使用的代码

Calendar cal_Two = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
System.out.println(cal_Two.getTime());

我得到的返回是:

Sat Jan 25 15:44:18 IST 2014

所以我尝试将默认时区更改为utc,然后检查,然后它就正常工作了。

Calendar cal_Two = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
System.out.println(cal_Two.getTime());

TimeZone tz  = TimeZone.getDefault() ;
TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
Calendar cal_Three = Calendar.getInstance();
System.out.println(cal_Three.getTime());
TimeZone.setDefault(tz);

结果:

Sat Jan 25 16:09:11 IST 2014
Sat Jan 25 10:39:11 UTC 2014

我是不是漏掉了什么?

提问于
用户回答回答于

System.out.println(cal_Two.getTime())调用返回Datefrom getTime()。它正在Date被转换为字符串println,并且该转换将IST在你的情况下使用默认时区。

你需要明确使用DateFormat.setTimeZone()显示Date所需的时区。

考虑这一点:

TimeZone timeZone = TimeZone.getTimeZone("UTC");
Calendar calendar = Calendar.getInstance(timeZone);
SimpleDateFormat simpleDateFormat = 
       new SimpleDateFormat("EE MMM dd HH:mm:ss zzz yyyy", Locale.US);
simpleDateFormat.setTimeZone(timeZone);

System.out.println("Time zone: " + timeZone.getID());
System.out.println("default time zone: " + TimeZone.getDefault().getID());
System.out.println();

System.out.println("UTC:     " + simpleDateFormat.format(calendar.getTime()));
System.out.println("Default: " + calendar.getTime());
用户回答回答于

java.util.Date独立于时区。当你输出cal_Two,虽然Calendar情况已经得到了它的时区设置为UTCcal_Two.getTime()将返回一个Date不具有一个时区的实例(并且总是在默认时区)

Calendar cal_Two = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
System.out.println(cal_Two.getTime());
System.out.println(cal_Two.getTimeZone());

输出:

 Sat Jan 25 16:40:28 IST 2014
    sun.util.calendar.ZoneInfo[id="UTC",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null] 

从javadoc的 TimeZone.setDefault()

设置getDefault方法返回的TimeZone。如果zone为空,则将默认值重置为VM初次启动时的值。

因此,移动你的setDefault()之前cal_Two被实例化,你会得到正确的结果。

TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
Calendar cal_Two = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
System.out.println(cal_Two.getTime());

Calendar cal_Three = Calendar.getInstance();
System.out.println(cal_Three.getTime());

输出:

Sat Jan 25 11:15:29 UTC 2014
Sat Jan 25 11:15:29 UTC 2014

扫码关注云+社区