时间戳概念

时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。
时间戳在全球任何一个地方都是一样的,即都是指格林威治时间1970年01月01日00时00分00秒到现在的总秒数,但是要计算不同地区的时间戳则需要加上要计算的时区与格林威治时区相差的毫秒数。

计算0点和24点时间戳

  1. 首先获取当前的时间戳,通过System.currentTimeMillis()获取当前的时间戳;此时实际获取的是格林威治时区(GMT)的时间戳。
  2. 获取当前时间到今天0点相差的毫秒数;

    • 这一步较为关键,System.currentTimeMillis()获取的是格林威治的时间戳,如果计算格林威治当前时间到0点的时间可以直接与一天的总毫秒数相余;
    • 但是北京时间比格林威治时间早8小时(要不咋们怎么称为东方呢!),要计算北京当前时间到0点之间的相差的毫秒数,需要先转换北京时区的时间戳,即加上8小时的毫秒数,再与一天的毫秒数相余。
  3. 将北京时间的时间戳减去到今天0点相差的毫秒数。
  4. 将北京时间的时间戳转换回格林威治时间戳。

 在我们使用java.util.Date计算当前的日期时,该类会自动帮助我们将格林威治的时间戳时间转换为北京时间的时间戳。 

格林威治时间与北京时间的关系如下:
图片描述 

本质上,我们计算北京时间的0点时间戳是通过将格林威治时间转换为北京时间计算得到结果,然后又将北京时间转换回格林威治时间戳。

代码
import java.util.concurrent.TimeUnit;

public class Main {

    public static final long MILLIS_OF_8_HOUR = TimeUnit.HOURS.toMillis(8);

    public static final long MILLIS_OF_DAY = TimeUnit.DAYS.toMillis(1);
    
    public static long computezeroPointTimestamp(long timestamp) {
        return timestamp - (timestamp + MILLIS_OF_8_HOUR) % MILLIS_OF_DAY;
    }
    
    public static long compute24PointTimestamp(long timestamp) {
        long zeroTimestamp = computezeroPointTimestamp(timestamp);
        return zeroTimestamp + MILLIS_OF_DAY;
    }
}

水一水
39 声望5 粉丝

总结经验,提升自己