消失的一小时

——关于时间你不知道的事

       问题是从业务需求要用C语言给下位机写了个:根据给的日期时间(年-月-日 时:分:秒)转换时间戳的算法计算开始的……

       不就计算时间戳嘛,顺利的代码很快就写好了。结果测试比较的时候发现某些时间转换的会相差1小时......

        用java重新实现函数算法来验证,直接上代码

public class TimeSpanTest {

    public static long SEC_BETWEEN(int iyear, int imon, int iday, int ihour, int imin, int isec) {
        int yearc, dayc, hourc, minc;
        int month = 1, h = 24, m = 60, j; // 基准月为1; 1970-1-1
        int i, monthc, byear;
        long min_count = 0;

        yearc = iyear - 1970;
        monthc = imon - 1;
        dayc = iday - 1;
        hourc = ihour - 0;
        minc = imin - 0;
        isec = isec - 0;
        byear = 1970;

        if (yearc == 0 && monthc == 0 && dayc == 0) {
            min_count = hourc * m + minc;
        } else if (yearc == 0 && monthc == 0 && dayc != 0) {
            min_count = (dayc * h + hourc) * m + minc;
        } else if (yearc == 0 && monthc != 0 && dayc != 0) {
            min_count = 0;
            for (i = 0; i < monthc; i++) {
                min_count = min_count + MONTH_DAYS(byear, month + i);
            }
            min_count = ((min_count + dayc) * h + hourc) * m + minc;
        } else if (yearc >= 1) {
            monthc = monthc + yearc * 12;
            min_count = 0;
            for (i = 0; i < monthc; i++) {
                if ((month + i) >= 12) {
                    j = (month + i) % 12;
                    if ((month + i) % 12 == 0) {
                        j = 12;
                    }
                    min_count = min_count + MONTH_DAYS(byear, j);
                    if ((month + i) % 12 == 0)
                        byear++;
                } else {
                    min_count = min_count + MONTH_DAYS(byear, month + i);
                }
            }
            min_count = ((min_count + dayc) * h + hourc) * m + minc;
        }
        return (min_count * 60) + isec - 28800; // +8:00时区调整
    }

    /**************************************************
     * 函数名:MONTH_DAYS 描 述:取得相应月份天数 输 入:uint16 dyear,uint8 dmonth 输 出:uint8 days
     * 说 明:
     **************************************************/
    public static int MONTH_DAYS(int dyear, int dmonth) {
        int days = 0;

        switch (dmonth) {
        case 1:
        case 3:
        case 5:
        case 7:
        case 8:
        case 10:
        case 12:
            days = 31;
            break;
        case 4:
        case 6:
        case 9:
        case 11:
            days = 30;
            break;
        case 2: {
            if (Is_Leap_Year(dyear) == 1) {
                days = 29;
            } else {
                days = 28;
            }
        }
            break;// 判断该年是否为闰年,若是days=29,否则days=28}
        default:
            break;
        }
        return days;
    }

    public static int Is_Leap_Year(int year) {
        if (year % 4 == 0) {
            if (year % 100 == 0) {
                if (year % 400 == 0) {
                    return 1;
                } else {
                    return 0;
                }
            } else {
                return 1;
            }
        } else {
            return 0;
        }
    }
}

确认代码逻辑没有问题,上测试代码以及运行结果

 结果很正确,来多个时间测试一波

 怎么有些结果不相同??

经过一番找原因,结果发现是因为历史原因导致的问题。总结下:以下来自网络搜索结果

 

 嗯,还有这个历史上消失的十天!历史悠悠,沧海桑田,今天在这不去追溯了。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

芯晖闲云

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值