看到有文章说如下方法可以获取今天的开始毫秒数:
final static TIME_DAY=24*60*60*1000;//一天的毫秒数
public long getDayStart(){
long cur=System.currentTimeMillis();
long dayStart=cur/TIME_DAY*TIME_DAY;
return dayStart;
}
原理是通过先除、后乘一天的时间,从而去掉余数部分,只保留到天部分的毫秒数。
但这个方法计算的是UTC时间的一天的开始毫秒数,因为System.currentTimeMillis()
返回的UTC时间,而国内使用的默认时区一般为GMT+8。用这种方法会出现“国内已经过0点了,而获取到的’今天的开始’还不变”的情况。
考虑时区的问题,应该把UTC时间转化为对应时区的时间获取该时区的一天的开始时间,再转化回UTC时间。
UTC与GMT+8的关系是GMT+8时间=UTC时间+8小时。
public static final int TIME_DAY=24*60*60*1000;
//System.currentTimeMillis()是UTC时间,UTC时间+8小时=GMT+8时间.
//转成GMT+8=GMT+0加8个小时。先以GMT+8计算一天的开始和结束,再转为UTC
public long getDayStart(){
long dayStart=(System.currentTimeMillis()+TIME_ZONE_OFFSET)
/TIME_DAY*TIME_DAY
-TIME_ZONE_OFFSET;
return dayStart;
}