使用默认时区即东八区:
int ONE_SECOND = 1000;
int ONE_MINUTE = 60*ONE_SECOND;
int ONE_HOUR = 60*ONE_MINUTE;
long ONE_DAY = 24*ONE_HOUR;
long ONE_WEEK = 7*ONE_DAY;
println("one week: " + ONE_WEEK);
println("one day: " + ONE_DAY);
GregorianCalendar calendar = new GregorianCalendar(1970,0,1);
long timestamp = calendar.getTimeInMillis();
println("timestamp: " + timestamp);
println("minute: " + timestamp/ONE_MINUTE);
timestamp为根据构造方法传入的时间和使用的时区,首先把时间转换为零时区(即英国格林尼治天文台旧址)的时间后,再转化为相对于1970,1月1日00:00:00的毫秒数。
所以如果不设置时区TimeZone,则上述代码得出的不是0,而是-28800000,即-8小时。因为东八区比零时区晚了8小时。再设置时区后,timestamp就为0了,代码如下:
int ONE_SECOND = 1000;
int ONE_MINUTE = 60*ONE_SECOND;
int ONE_HOUR = 60*ONE_MINUTE;
long ONE_DAY = 24*ONE_HOUR;
long ONE_WEEK = 7*ONE_DAY;
println("one week: " + ONE_WEEK);
println("one day: " + ONE_DAY);
GregorianCalendar calendar = new GregorianCalendar(1970,0,1);
calendar.setTimeZone(new SimpleTimeZone(0, "GMT"));
long timestamp = calendar.getTimeInMillis();
println("timestamp: " + timestamp);
println("minute: " + timestamp/ONE_MINUTE);
SimpleTimeZone中的第一个参数为与零时区相差的毫秒数,如果是设置为东八区的话,那么应该设置成:
calendar.setTimeZone(new SimpleTimeZone(-ONE_HOUR*8, "GMT"));
第二个参数,设置为GMT和UTC是一样的结果。理论上,UTC才是目前的标准世界时,GMT与UTC大概相差0.9秒。但是在代码中使用UTC或者GMT参数,得到的timestamp的结果是一样的。
月是从0开始的,dayOfMonth是从1开始的。
本文介绍了Java中GregorianCalendar如何处理时区问题,特别是东八区(中国时区)的时间转换。默认情况下,时间会被转换为格林尼治标准时间(GMT),导致与预期时间相差8小时。通过设置TimeZone,可以正确获取时间戳。SimpleTimeZone的参数配置也进行了说明,包括时区偏移毫秒数和标识(UTC/GMT)。此外,还提到了月份和日期的起始值(月从0开始,日从1开始)。

1350

被折叠的 条评论
为什么被折叠?



