时间戳转换日期算法


前言

最近在调试服务器,然后写了一个调试信息,图中红框就是,我发现自己写的调试信息虽然能用但是我 这个强迫症患者真滴看不下去,这他喵夹杂在slf4j 打印的日志信息感觉很怪异,因为slf4j打印的日志格式是标准的,我这个调试信息就是那么随手的一写,显得特别的突兀,这围在周围的标准日志信息,给我营造了一种别人都很行只有自己不行的氛围,真的栓Q了,那么为了把调试信息写的接近标准的日志,我就先从第一小步开始,那就是研究那个时间是咋搞的
这也太low了
今天研究了半天,发现这玩意要写出来很容易,直接
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));

    }

}

总结

可是,时间戳又是怎么来的呢?
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值