格林威治标准时间(中国大陆翻译:格林尼治平均时间或格林尼治标准时间,台、港、澳翻译:格林威治标准时间;英语:Greenwich MeanTime,GMT)是指位于英国伦敦郊区的皇家格林威治天文台的标准时间,因为本初子午线被定义在通过那里的经线。
自1924年2月5日开始,格林威治天文台每隔一小时会向全世界发放调时信息。
理论上来说,格林威治标准时间的正午是指当太阳横穿格林威治子午线时(也就是在格林威治上空最高点时)的时间。由于地球在它的椭圆轨道里的运动速度不均匀,这个时刻可能与实际的太阳时有误差,最大误差达16分钟。
由于地球每天的自转是有些不规则的,而且正在缓慢减速,因此格林威治时间已经不再被作为标准时间使用。现在的标准时间,是由原子钟报时的协调世界时(UTC)。
协调世界时又称世界标准时间或世界协调时间,简称UTC(从英文“Coordinated Universal Time”/法文“Temps Universel Cordonné”而来)。国际电信联盟希望协调世界时能够在所有语言有单一的缩写。英语和法语区的人同时希望各自的语言缩写,CUT和TUC,能够成为国际标准。结果最后妥协使用UTC[1]。
在中国大陆[2]、香港、澳门、蒙古国、台湾、新加坡、马来西亚、菲律宾、澳大利亚西部的本地时间比UTC快8小时,就会写作UTC+8,俗称东8区。如果是在本地时间比UTC时间慢的地区,例如夏威夷的时间比UTC时间慢10小时,就会写作UTC-10,俗称西10区。
为了与POSIX标准统一,以“Etc/GMT”标记的时区将保留时区符号,即在格林威治时间(GMT)以西的区域的时区符号为正,以东区域符号为负。
GMT和UTC表示时区刚好符号相反
public static void main(String[] args) {
String[] tz=TimeZone.getAvailableIDs();
for (String z : tz) {
//System.out.println(z);
}
System.out.println("TimeZone = " +TimeZone.getDefault().getID());
Calendar c=Calendar.getInstance();
c.setTimeInMillis(0);
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH)+1;
int day = c.get(Calendar.DATE);
int hh = c.get(Calendar.HOUR_OF_DAY);
int mi = c.get(Calendar.MINUTE);
int ss = c.get(Calendar.SECOND);
System.out.println(year+"-"+month+"-"+day+" "+hh+"-"+mi+"-"+ss);
c.set(1970,0,1,0,0,0);
System.out.println(c.getTimeInMillis());// 东8区
year = c.get(Calendar.YEAR);
month = c.get(Calendar.MONTH)+1;
day = c.get(Calendar.DATE);
hh = c.get(Calendar.HOUR_OF_DAY);
mi = c.get(Calendar.MINUTE);
ss = c.get(Calendar.SECOND);
c.setTimeZone(TimeZone.getTimeZone("Etc/UTC"));
System.out.println(year+"-"+month+"-"+day+" "+hh+"-"+mi+"-"+ss);
c.set(1970,0,1,0,0,0);
System.out.println(c.getTimeInMillis());
/*
* 输出
TimeZone = Asia/Shanghai
1970-1-1 8-0-0
-28800000
1970-1-1 0-0-0
0
*/
}