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

Java Calendar.getInstance(TimeZone.getTimeZone(“UTC”)未返回UTC时间,java,Java,我对使用Calendar.getInstance(TimeZone.getTimeZone(“UTC”))method调用得到的结果感到非常困惑,它返回的是IST时间 这是我使用的代码 Calendar cal_Two = Calendar.getInstance(TimeZone.getTimeZone("UTC")); System.out.println(cal_Two.getTime()); 我得到的答复是: Sat Jan 25 15:44:18 IST 2014 所以我试着将默认

我对使用
Calendar.getInstance(TimeZone.getTimeZone(“UTC”))
method调用得到的结果感到非常困惑,它返回的是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())
会从
getTime()返回一个
日期。它是将转换为
println
字符串的
Date
,该转换将在您的情况下使用默认的
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());

尝试使用
GMT
而不是
UTC
。它们指的是同一时区,但名称
GMT
更为常见,可能会起作用。

java.util.Date
独立于时区。当您打印
cal\u Two
时,尽管
日历
实例已将其时区设置为
UTC
cal\u Two.getTime()
将返回一个没有时区(且始终处于默认时区)的
日期
实例

输出:

 Sat Jan 25 16:40:28 IST 2014
    sun.util.calendar.ZoneInfo[id="UTC",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null] 
Sat Jan 25 11:15:29 UTC 2014
Sat Jan 25 11:15:29 UTC 2014
TimeZone.setDefault()的javadoc

设置getDefault方法返回的时区。中频区 如果为null,则将默认值重置为VM启动时的初始值 首先开始

因此,在实例化
cal\u Two
之前移动
setDefault()
,您将得到正确的结果

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 16:40:28 IST 2014
    sun.util.calendar.ZoneInfo[id="UTC",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null] 
Sat Jan 25 11:15:29 UTC 2014
Sat Jan 25 11:15:29 UTC 2014
他在为我工作

如果您想查看时区列表,以下是代码


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

TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
所以代码看起来像:

TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
Calendar cal_Two = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
System.out.println(cal_Two.getTime());
解释:如果要更改时区,请使用
时区设置默认时区。setDefault()

它对我有效

获取时间戳类型:

public static Timestamp getCurrentTimestamp() {
    TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
    final Calendar cal = Calendar.getInstance();
    Date date = cal.getTime();
    Timestamp ts = new Timestamp(date.getTime());
    return ts;
}
获取字符串类型:

    public static String getCurrentTimestamp() {
    TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
    final Calendar cal = Calendar.getInstance();
    Date date = cal.getTime();
    Timestamp ts = new Timestamp(date.getTime());
    return ts.toString();
}

我已经找了一会儿了。也许标题不够明确?顺便说一句,谢谢你的帮助如果你显示System.out.println:)的结果,你可以节省很多时间。我明白了。。谢谢但我不明白SimpleDataFormat类如何负责设置时区。更改时区会更改实际时间,而不是其格式。SimpleDateFormat的工作只是格式化日期,而不是操纵时间……完美的答案!!这(必须设置格式化程序的时区)每次都会让我感到困惑,即使我设置了日历的时区。使用GMT也会产生相同的结果。
TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
Calendar cal_Two = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
System.out.println(cal_Two.getTime());
public static Timestamp getCurrentTimestamp() {
    TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
    final Calendar cal = Calendar.getInstance();
    Date date = cal.getTime();
    Timestamp ts = new Timestamp(date.getTime());
    return ts;
}
    public static String getCurrentTimestamp() {
    TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
    final Calendar cal = Calendar.getInstance();
    Date date = cal.getTime();
    Timestamp ts = new Timestamp(date.getTime());
    return ts.toString();
}