前言
最近在调试服务器,然后写了一个调试信息,图中红框就是,我发现自己写的调试信息虽然能用但是我 这个强迫症患者真滴看不下去,这他喵夹杂在slf4j 打印的日志信息感觉很怪异,因为slf4j打印的日志格式是标准的,我这个调试信息就是那么随手的一写,显得特别的突兀,这围在周围的标准日志信息,给我营造了一种别人都很行只有自己不行的氛围,真的栓Q了,那么为了把调试信息写的接近标准的日志,我就先从第一小步开始,那就是研究那个时间是咋搞的
今天研究了半天,发现这玩意要写出来很容易,直接
new SimpleDateFormat(“yyyy年MM月dd日 HH:mm:ss.SSS”).format(new java.util.Date());
真滴栓q了这研究了半天岂不是白搞了吗,不行我觉得不能就么一笔带过
那么这个时间戳格式化究竟是如何实现的呢?
废话少说直接上代码
一、代码
import org.junit.Test;
import java.text.SimpleDateFormat;
/**
* @author Xiaosi_lemon
* @title: MyTimeFormatTest
* @projectName SpringMVC
* @description: TODO
* @date 2022/8/6上午 11:03
*/
public class MyTimeFormatTest{
@Test
public void formatTime() {
//获取时间戳:从1970年1月1日 00:00:00 到 今天的格林时间GMT
long timestamp = System.currentTimeMillis();
//毫秒
long MS = 1;
//秒换算成毫秒
long SECOND = 1000 * MS;
//分钟换算成毫秒
long MIN = 60 * SECOND;
//小时换算成毫秒
long HOUR = 60 * MIN;
//一天等于多少毫秒
long DAY = 24 * HOUR;
//从1970年1月1日00:00:00开始一共有多少天
Long temp1 = (timestamp / DAY);
/*
* 为什么要加1,因为计算机是从0号开始算的,而人类计算日期是从1号开始算,起始点不一样
* 其实不加1的话就是算从1970年到今天一共真正过了多少天
* 比如今天是1970年1月2日 12:00:00
* 满打满算应该是过了一天+12个小时
* 对计算机而言他并不知道这多出来的12个小时表示正在开始今天
* 它只知道过完一天就应该在日子上加个1,但是不符合我们日常的日期表示方式
* 1月2日 12:00:00 按照生活中的表示应该是 今天是1月2日 的中午12:00 今天没有过完
* 但是计算机只管计算 它会认为从0天起过完了2天 同时又过了12个小时
* 所以这里加个1表示今天的意思,表示的是第几天,并不表示已经走过了多少天
*/
Integer days = temp1.intValue() + 1;
//4年中就会出现一次闰年,共有1461天
Integer YEAR4DAYS = 365 + 365 + 365 + 366;
//计算周期
//这是算走完了多少个周期
Integer cycle_int = days / YEAR4DAYS;
//这是算没有走完周期的天数
Integer cycle_remain = days % YEAR4DAYS;
//闰年状态
Boolean LEAPYEAR = false;
//今年 第1970年 + 走过了几个4年 注意是第 所以后边的判断第几年会少加一年,比如第二年 只加了一年
Integer year = 1970 + cycle_int * 4;
//今年的第几天
Integer thisYearDay = 0;
if (cycle_remain < 365) { //⼀个周期内,第⼀年
//平年
thisYearDay = cycle_remain;
} else if (cycle_remain < (365 + 365)) {//⼀个周期内,第⼆年
//平年
year += 1;
thisYearDay = cycle_remain - 365;
} else if (cycle_remain < (365 + 365 + 365)) {//⼀个周期内,第三年
//平年
year += 2;
thisYearDay = cycle_remain - (365 + 365);
} else {//⼀个周期内,第四年,这⼀年是闰年
//润年
year += 3;
thisYearDay = cycle_remain - (365 + 365 + 365);
LEAPYEAR = true;
}
int[] YEAR_MONTH_NORMAL = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; //平年
int[] YEAR_MONTH_LEAP = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; //闰年
int[] YEAR_MONTH;
//如果今年不是闰年
if (!LEAPYEAR) {
YEAR_MONTH = YEAR_MONTH_LEAP;
} else {
YEAR_MONTH = YEAR_MONTH_NORMAL;
}
Integer month = 0;
Integer day = 0;
//用于保存差值
Integer temp2 = 0;
//开始计算今天是第几个月
for (int i = 0; i < 12; i++) {
//如果是第一次
if (i == 0) {
temp2 = thisYearDay - YEAR_MONTH[i];
} else {
temp2 -= YEAR_MONTH[i];
}
//减到头了说明是当前月
if (temp2 <= 0) {
temp2 += YEAR_MONTH[i];
day = temp2;
month = i + 1;
break;
}
}
//开始计算时分秒毫秒
//今天的毫秒
long today_ms = timestamp % DAY;
//今天的小时,北京时间是GMT+8 所以要加8个小时
long hour = today_ms / HOUR +8;
//今天的分
long min = (today_ms % HOUR) / MIN;
//今天的秒
long second = (today_ms % HOUR % MIN) / SECOND;
//今天的毫秒
long ms = today_ms % HOUR % MIN %SECOND ;
//打印结果
System.out.printf("(*^▽^*):%d年%d月%d日 %d时%d分%d秒%d毫秒%n", year, month, day,hour,min,second,ms);
System.out.println("(*/ω\*):"+new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss.SSS").format(timestamp));
}
}
总结
可是,时间戳又是怎么来的呢?