Calendar.getInstance(TimeZone.getTimeZone("UTC"))未返回UTC时间

vic*_*cky 93 java

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

这是我使用的代码

Calendar cal_Two = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
System.out.println(cal_Two.getTime());
Run Code Online (Sandbox Code Playgroud)

我得到的回应是:

Sat Jan 25 15:44:18 IST 2014
Run Code Online (Sandbox Code Playgroud)

所以我尝试将默认TimeZone更改为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);
Run Code Online (Sandbox Code Playgroud)

结果:

Sat Jan 25 16:09:11 IST 2014
Sat Jan 25 10:39:11 UTC 2014
Run Code Online (Sandbox Code Playgroud)

我在这里错过了什么吗?

moc*_*ace 134

System.out.println(cal_Two.getTime())调用返回DategetTime().它是Date转换为字符串的println,并且转换将使用IST您的情况下的默认时区.

您需要明确用于在所需的时区DateFormat.setTimeZone()打印Date.

编辑:由@Laurynas提供,请考虑以下事项:

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());
Run Code Online (Sandbox Code Playgroud)

  • 如果显示System.out.println的结果,可以节省大量时间使用:) (3认同)

Pop*_*ibo 12

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

Calendar cal_Two = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
System.out.println(cal_Two.getTime());
System.out.println(cal_Two.getTimeZone());
Run Code Online (Sandbox Code Playgroud)

输出:

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

来自javadoc TimeZone.setDefault()

设置getDefault方法返回的TimeZone.如果zone为null,则将默认值重置为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());
Run Code Online (Sandbox Code Playgroud)

输出:

Sat Jan 25 11:15:29 UTC 2014
Sat Jan 25 11:15:29 UTC 2014
Run Code Online (Sandbox Code Playgroud)


Fab*_*ian 6

Calendar currentTime = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
currentTime.set(Calendar.ZONE_OFFSET, TimeZone.getTimeZone("UTC").getRawOffset());
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, currentTime.get(Calendar.HOUR_OF_DAY));
calendar.getTimeInMillis()
Run Code Online (Sandbox Code Playgroud)

为我工作


Mon*_*a V 6

你肯定错过了一件小事,那就是你没有设置默认值:

TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
Run Code Online (Sandbox Code Playgroud)

所以代码看起来像:

TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
Calendar cal_Two = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
System.out.println(cal_Two.getTime());
Run Code Online (Sandbox Code Playgroud)

说明:如果要更改时区,请使用设置默认时区TimeZone.setDefault()