与Java日历和时区混淆

时间:2015-07-13 20:40:59

标签: java

考虑以下代码片段......

import java.util.Calendar;
import java.util.TimeZone;


public class Main {
    public static void main(String[] args) {

        Calendar c = Calendar.getInstance();
        System.out.println(c.getTimeZone().getDisplayName());
        System.out.println(c.getTime());
        System.out.println(c.get(Calendar.HOUR_OF_DAY));

        Calendar gmtCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
        System.out.println(gmtCal.getTimeZone().getDisplayName());
        System.out.println(gmtCal.getTime());
        System.out.println(gmtCal.get(Calendar.HOUR_OF_DAY));

        Calendar c2 = Calendar.getInstance(TimeZone.getTimeZone("US/Alaska"));
        System.out.println(c2.getTimeZone().getDisplayName());
        System.out.println(c2.getTime());
        System.out.println(c2.get(Calendar.HOUR_OF_DAY));
    }
}

该程序的输出是

Eastern Standard Time
Mon Jul 13 16:10:14 EDT 2015 
16
Greenwich Mean Time
Mon Jul 13 16:10:14 EDT 2015  //<--- also not sure why this isn't 4 hours ahead as Eastern time is UTC/GMT - 4 right now due to DST
20
Alaska Standard Time
Mon Jul 13 16:10:14 EDT 2015 //<--- date is not reflecting correct time and is showing EDT versus AST
12

为什么get(Calendar.HOUR_OF_DAY)方法调用与getTime()方法调用中的小时不匹配?另一种说法是,为什么这不是输出?

Eastern Standard Time
Mon Jul 13 16:10:14 EDT 2015
16
Greenwich Mean Time
Mon Jul 13 20:10:14 GMT 2015
20
Alaska Standard Time
Mon Jul 13 12:10:14 AST 2015
12

编辑... 那么我怎样才能得到以下内容

long t = 1436842840327L;
Calendar c = Calendar.getInstance();
c.setTimeInMillis(t);
c.setTimeZone(TimeZone.getTimeZone("US/Alaska"));
System.out.println(c.getTime());
System.out.println(c.get(Calendar.HOUR_OF_DAY) + ":" + c.get(Calendar.MINUTE) + ":" + c.get(Calendar.MILLISECOND));

打印与getTime()相同的小时?目前的输出是

Mon Jul 13 23:00:40 EDT 2015
19:0:327

2 个答案:

答案 0 :(得分:4)

函数getTime()返回Date object,当转换为字符串时,Date对象使用您的默认时区表示。

因此,通过使用getTime(),您将获得一个不再包含时区数据的Date对象(Date只是一个特定的时间点)。然后,Date对象在打印时被隐式转换为字符串。

答案 1 :(得分:2)

Java doc明确指出方法getInstance()

  

公共静态日历getInstance()
  使用默认时区和区域设置获取日历。返回的日历是,基于默认时区的当前时间,使用默认的区域设置。

(强调我的)