unsigned char idata in[5] = ;//2023年7月14日20時15分
unsigned char idata out[5] = ;//2023年7月15日8時14分
unsigned char idata in_time[5];//存進場時間的16進製制數
unsigned char idata out_time[5];//存出場時間的16進製制數
首先把這兩個陣列的bcd碼轉成hex碼
轉換演算法:比如把bcd碼12h轉換成16進製制,用12h-6,得到0ch,就是對應的16進製制數。十位為n,就用bcd碼-n*6,如23h,23h-2*6=17h,17h就是bcd碼23
把乙個bcd碼陣列轉換成16進製制陣列
void bcd_to_hex(unsigned char *bcd_array,unsigned char *hex_array,unsigned char n)
unsigned char i = 0;
unsigned char temp;
for(i = 0;i < n;i++)
temp = (bcd_array[i] & 0xf0) >> 4;
hex_array[i] = bcd_array[i];
while(temp--)
hex_array[i] = hex_array[i] - 0x06;
然後呼叫函式difftime(unsigned char *in_time,unsigned char *out_time)得到進出時間相隔多少分鐘
計算車在場內停留的時間,單位分鐘
能計算的最長停留時間是65535/(24*60)=45.5天
unsigned int difftime(unsigned char *in_time,unsigned char *out_time)
int days,months,years,result;
char leap,temp_year,temp,temp_hour;
int code monthday[2][12] = ,//平年每月天數
//閏年每月天數
leap = leapyear(out_time[0]);
years = out_time[0] - in_time[0];
months = out_time[1] - in_time[1];
days = out_time[2] - in_time[2];
temp_year = in_time[0];
if((years > 0) && (in_time[1] > 2))
if(leapyear(temp_year))
days--; //如果進場時間是閏年,且月份大於2,那麼要減1天,因為2月29日沒算進去
while(years > 0)
if(leapyear(temp_year))
days += 366;
else
days += 365;
temp_year++;
years--;
temp = in_time[1]; //暫存進場時間月份
if(months > 0)
while(months > 0)
days += monthday[leap][temp++ - 1];// temp先減1,然後再自加1,減1是因為monthday下標是從零開始
months --;
else
while(months < 0)
temp--;
days -= monthday[leap][temp - 1];
months++;
temp = out_time[4]; //暫存出場時間的分鐘
temp_hour = out_time[3]; //暫存出場時間的小時
if(temp < in_time[4])
temp += 60; //如果出場時間的分鐘小於進場時間的分鐘,那麼出場時間分鐘加60
temp_hour -= 1;//出場時間小時減1
result = days * 24 * 60 + (temp_hour - in_time[3]) *60 + temp - in_time[4];
return result;
判斷年是否閏年的函式如下:
演算法:先判斷年是否可以被4整除,如果不可以,不是閏年,如果可以,繼續判斷,看是否可以被100整除,如果不可以,則是閏年,如1996,如果可以被100整除,繼續判斷,看是否可以被400整除,如果可以則是閏年,如果不可以,則不是。如1900可以被4整除,繼續判斷,可以被100整除,繼續判斷,不可以被400整除,則不是閏年。2000則是閏年。
判斷是否是閏年 閏年返回1,平年返回0
char leapyear(unsigned char year)
unsigned int y;
y = year + 2000;
if ((y % 400 == 0) || ((y %100 != 0) && (y %4 == 0)))
return 1;
else
return 0;
寫成c檔案如下:
unsigned char idata in[5] = ;//2023年7月14日20時15分
unsigned char idata out[5] = ;//2023年7月15日8時14分
unsigned char idata in_time[5];//存進場時間的16進製制數
unsigned char idata out_time[5];//存出場時間的16進製制數
void main()
unsigned int i = 0;
bcd_to_hex(in,in_time,5);
i = difftime(in_time,out_time);
執行得i = 0x2cf 即719分鐘,與實際時間差相符。
C 計算時間差
計算比較兩個時間之間的差 計算兩個日期的時間間隔 第乙個日期和時間 第二個日期和時間 private string datediff datetime datetime1,datetime datetime2 timespan常用方法和屬性 add 與另乙個timespan值相加。days 返回用天...
計算時間差
計算時間差的問題,之前用的datediff datediff 返回跨兩個指定日期的日期和時間邊界數。語法datediff datepart startdate enddate 引數datepart 是規定了應在日期的哪一部分計算差額的引數。下表列出了 microsoft sql server 識別的...
計算時間差
php 初始化變數 stardate substr gstardate,0,10 enddate substr genddate,0,10 共有多少天 start mktime 0,0,0,substr stardate,5,2 substr stardate,8,2 substr stardate...