其他分享
首页 > 其他分享> > C语言练习项目-UNIX时间戳4字节转时间可移植函数单片机嵌入式

C语言练习项目-UNIX时间戳4字节转时间可移植函数单片机嵌入式

作者:互联网

4字节unix时间戳和正常年月日互相转换,很多协议用的到,c语言,有可以优化的地方欢迎讨论,根据网上案例总结优化后自己写的。

评论免费拿走!!!

  1 #include"stdio.h"
  2 #include "stdint.h"
  3 #include <string.h>
  4 
  5 #define TIME_ZONE 8 //北京时间
  6 
  7 uint8_t Common_month_day[12]={ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; //平年 
  8 uint8_t Leap_month_day[12] ={ 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; //闰年
  9 
 10 typedef struct 
 11 {
 12 uint32_t Year; // 1970~2038
 13 uint8_t Month; // 1~12
 14 uint8_t Day; // 1~31
 15 uint8_t Hour; // 0~23
 16 uint8_t Min; // 0~59
 17 uint8_t Sec; // 0~59 
 18 }UTC_TIME_T;
 19 
 20 UTC_TIME_T Standard_Time = {0};
 21 
 22 unsigned int year_days(unsigned int year)
 23 {
 24 return ( ((year%4 == 0 && year%100 != 0) || (year%400 == 0)) ? 366 : 365 );
 25 }
 26 
 27 void* unix_to_time(unsigned long long unix)
 28 {
 29 UTC_TIME_T* time_p = &Standard_Time;
 30 
 31 uint32_t day_total = 0;
 32 uint32_t day_compare = 0;
 33 uint32_t sec_total = 0;
 34 
 35 if(unix > 2147483647) //32 位限制,0x7FFFFFFF 
 36 unix = 0;
 37 
 38 unix += (TIME_ZONE*60*60); //时区的差值 
 39 day_total = unix/(60*60*24);
 40 sec_total = unix%(60*60*24);
 41 
 42 for( time_p->Year = 1970; time_p->Year < 2039; time_p->Year ++ ) 
 43 {
 44 day_compare    += year_days(time_p->Year);
 45 if( day_total < day_compare)    
 46 {
 47 day_total -= (time_p->Year == 1970) ? 0 : (day_compare - year_days(time_p->Year));    
 48 break;
 49 }
 50 }
 51 
 52 for( day_compare = 0,time_p->Month = 1; time_p->Month < 13; time_p->Month ++ )
 53 {    
 54 day_compare += ( year_days( time_p->Year ) == 366 ) ? Leap_month_day[time_p->Month-1] : Common_month_day[time_p->Month-1] ;
 55 
 56 if( day_total < day_compare)    
 57 {
 58 if(time_p->Month != 1)
 59 day_total -= ( year_days( time_p->Year ) == 366 ) ? (day_compare - Leap_month_day[time_p->Month-1]) : (day_compare - Common_month_day[time_p->Month-1]);    
 60 time_p->Day = ++day_total;
 61 break;
 62 }
 63 }
 64 time_p->Hour = sec_total/(60*60);
 65 time_p->Min = (sec_total%(60*60))/60;
 66 time_p->Sec = sec_total%60;    
 67 return time_p;    
 68 }
 69 
 70 unsigned long long time_to_unix(void* time_input)
 71 {
 72 unsigned int temp = 0;
 73 unsigned long long unix = 0;
 74 UTC_TIME_T *time = (UTC_TIME_T*) time_input;
 75 
 76 for( temp = 1970; temp < time->Year; temp++ )
 77 unix += year_days( temp )*(60*60*24); 
 78 
 79 for( temp = 1; temp < time->Month; temp++ )
 80 unix += (60*60*24)*((year_days(time->Year) == 366) ? (Leap_month_day[temp-1]) : (Common_month_day[temp-1])) ;
 81 
 82 unix += (time->Day - 1) * (60*60*24);
 83 unix += time->Hour * (60*60);
 84 unix += time->Min * 60;
 85 unix += time->Sec;
 86 unix -= (TIME_ZONE*60*60); //减时区    
 87 return unix;    
 88 }
 89 
 90 int main()
 91 {
 92 unsigned long long temp;
 93 unsigned long long unix_long;
 94 
 95 UTC_TIME_T *time_temp;
 96 
 97 while(1)
 98 {    
 99 printf("input unix:");    
100 scanf("%lld",&temp);
101 
102 time_temp = unix_to_time( temp );
103 unix_long = time_to_unix( time_temp );
104 
105 printf("%4d-%02d-%02d %02d:%02d:%02d unix:%lld\r\n",time_temp->Year,time_temp->Month,time_temp->Day,time_temp->Hour,time_temp->Min,time_temp->Sec,unix_long);    
106 }
107 
108 return 0;
109 }
110 
111 #if 0
112 unsigned long long byte_to_long(uint8_t high_three, uint8_t high_two, uint8_t low_one,uint8_t low_zero)
113 {
114 return (high_three*16777216 + high_two*65536 + low_one*256 + low_zero);
115 }
116 #endif

 

标签:temp,31,可移植,C语言,60,单片机,unix,time,day
来源: https://www.cnblogs.com/rocket-zdsad/p/14593057.html