我们经常看到一个时间用long类型数据来表示,例如:1580704106823 表示当前时间:2020年02月03日12时28分26秒823毫秒
那么为什么时间可以用一个long类型数据来表示呢?下面我们来一点点的分析:
首先,介绍一个概念,时间戳:
百度百科:时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总毫秒数
上述介绍已经把为什么可以用long类型表示一个时间了,下面我们开始去验证这个是否正确
环境说明:咱们属于中国,时间戳是从北京时间1970年01月01日08时00分00秒000毫秒开始计时的
将总毫秒数:1580704106823 进行逐一分解
long time = 1580704106823L;
- 计算总的秒数: 1580704106 秒
long seconds = time / 1000;
- 计算总的分钟数:26345064 分钟
long minutes = time/ (1000 * 60);
- 计算总的小时数:439084 小时
long hours = time / (1000 * 60 * 60);
- 计算总的天数:18295 天
long days = time / (1000 * 60 * 60 * 24);
现在我们还需要知道 1970 - 2019 年之间有多少个闰年?
编写求一段时间内的闰年总数:
闰年定义:可以被 4 整除但不能被 100 整除,以及可以被 400 整除的年份
private static long getLeapYears(long start, long end) {
long count = 0;
for (long year = start; year <= end; year++) {
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0){
count++;
}
}
return count;
}
- 计算 1970-2019 之间的闰年数:12个
long leapYears = getLeapYears(1970, 2019);
现在我们来算一下
- 离 1970 年过去了多少年了:50年
(总的天数-闰年数)/ 365 = 时隔年数
long intervalYears = (days - leapYears) / 365;
上述 intervalYears = 50,表示离 1970 年已经过了 50 年了,正好验证:2020 = 1970 + 50
- 除去年份干扰,算离2020年01月01日过去了多少天:33天
long intervalDays = days - (intervalYears * 365 + leapYears);
上述 intervalDays = 33,表示离2020年01月01日已经过了33天,正好验证:01月01日 + 33 天 = 02月03日
- 除去天数干扰,算离2020年02月03日08时过去了多少小时:4时
long intervalHours = hours - days * 24;
上述 intervalHours = 4,表示离2020年02月03日08时已经过了4个小时,正好验证:08时 + 4时 = 12时
- 除去小时干扰,算离2020年02月03日12时00分过去了多少分钟:28分
long intervalMinutes = minutes - hours * 60;
上述 intervalMinutes = 24,表示离2020年02月03日08时00分过去了28分钟,正好验证:00分 + 28分 = 28分
- 除去分钟干扰,算离2020年02月03日12时28分00秒过去了多少秒:26秒
long intervalSeconds = seconds - minutes * 60;
上述 intervalSeconds,表示离2020年02月03日12时28分00秒过去了26秒,正好验证:00秒 + 26秒 = 26秒
- 除去秒数干扰,算离2020年02月03日12时28分26秒000毫秒过去了多少毫秒:823毫秒
long intervalMilliseconds = time - seconds * 1000;
上述 intervalMilliseconds,表示离2020年02月03日12时28分26秒000毫秒过去了823毫秒,正好验证:000毫秒 + 823毫秒 = 823毫秒
经过上述的分析:我们明白了为什么一个时间可以用一个long类型存储,long类型存储的是1970年01月01日00秒000毫秒到现在的时间之间的间隔毫秒数
也就是:1970年01月01日00秒000毫秒 + 1580704106823毫秒 = 2020年02月03日12时28分26秒823毫秒