——关于时间你不知道的事
问题是从业务需求要用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;
}
}
}
确认代码逻辑没有问题,上测试代码以及运行结果
结果很正确,来多个时间测试一波
怎么有些结果不相同??
经过一番找原因,结果发现是因为历史原因导致的问题。总结下:以下来自网络搜索结果
嗯,还有这个历史上消失的十天!历史悠悠,沧海桑田,今天在这不去追溯了。