考虑以下代码片段......
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
答案 0 :(得分:4)
函数getTime()返回Date object,当转换为字符串时,Date对象使用您的默认时区表示。
因此,通过使用getTime(),您将获得一个不再包含时区数据的Date对象(Date只是一个特定的时间点)。然后,Date对象在打印时被隐式转换为字符串。
答案 1 :(得分:2)
Java doc明确指出方法getInstance()
:
公共静态日历getInstance()
使用默认时区和区域设置获取日历。返回的日历是,基于默认时区的当前时间,使用默认的区域设置。
(强调我的)