没有gmttime&localtime api调用,怎么办?
来源:互联网 发布:网络计算机能打印吗 编辑:程序博客网 时间:2024/06/06 00:42
在嵌入式开发上,又遇到过没有标准c api使用的情况没有?肯定有!
#include <stdio.h>#include <string.h>#include <time.h>typedef struct { int tm_sec; /* 秒 – 取值区间为[0,59] */ int tm_min; /* 分 - 取值区间为[0,59] */ int tm_hour; /* 时 - 取值区间为[0,23] */ int tm_mday; /* 一个月中的日期 - 取值区间为[1,31] */ int tm_mon; /* 月份(从一月开始,0代表一月) - 取值区间为[0,11] */ int tm_year; /* 年份,其值等于实际年份减去1900 */ int tm_wday; /* 星期 – 取值区间为[0,6],其中0代表星期天,1代表星期一,以此类推 */ int tm_yday; /* 从每年的1月1日开始的天数 – 取值区间为[0,365],其中0代表1月1日,1代表1月2日,以此类推 */ int tm_isdst; /* 夏令时标识符,实行夏令时的时候,tm_isdst为正。不实行夏令时的进候,tm_isdst为0;不了解情况时,tm_isdst()为负。*/ }my_tm_t;/*seconds 是从1970年1月1日utc时间0时0分0秒到某一时刻的总秒数正常情况下函数返回指针就是参数指针local_time,非正常情况为null*/my_tm_t *my_gmtime(unsigned long seconds, my_tm_t *gmt_time) {const char mons[]={31,28,31,30,31,30,31,31,30,31,30}; register unsigned long time = seconds; register int islpyr, lpcnt; register int y, ystart, i, t;if(gmt_time==NULL){return NULL;}memset(gmt_time,0x00,sizeof(my_tm_t));gmt_time->tm_isdst= -1;i=time;while (i<0){i+= 7L*24*60*60*1000; /* preserve the day of the week */}i = (i/(24*60*60))%7-3;while (i<0){i += 7;}gmt_time->tm_wday = i;i = time % (24l*60*60);if ( i<0 ) {i = i+24l*60*60;}gmt_time->tm_hour = (i/(60*60))%24;gmt_time->tm_min = (i/60)%60;gmt_time->tm_sec = i%60;y = time/(365*24*60*60+6*60*60); /* a year is about 365.25 days */y += 370;do {islpyr = y%4==0 && (y%100!=0 || y%400==0);lpcnt = y/4;lpcnt -= y/100;lpcnt += y/400;lpcnt -= 89; /* number of leap years in 370 years */ystart = (y-370)*(365*24*60*60) + lpcnt*(24*60*60);if ( ystart>time ){ --y;} } while ( ystart>time ); /* should loop at most twice, at least once */time -= ystart;time /= 24*60*60;/* [JY] Tue Jan 3 14:24:47 PST 1995. was possible to get 12/32/94 from this.*//* If we get here with time of 365, this will happen. Simply set the day to *//* zero and increment the year. This should work. */if ( time == 365 ) {time=0;y++;}/* end of new code */if ( islpyr ){++ time;}gmt_time->tm_yday= time;++ time;for ( i=0; i<11; ++i ){t = mons[i];if ( i==1 && islpyr ){ ++t;}if ( time<=t ){ break;}time -= t; } gmt_time->tm_year = y-300; gmt_time->tm_mon = i; gmt_time->tm_mday = time; /* we incremented the mday above */ return(gmt_time);}/* If no other implementation provided, assume Epoch is 00:00:00 January 1,1970 as is true in UNIX. There should be code in here to calculate daylight savings time in different ways than the one given here. Which is true for USA as of 1987. The rules I follow are:before 1987 at 2am of the last sunday of april dst starts at 2am of the last sunday of october dst ends1987 and after at 2am of the first sunday of april dst starts at 2am of the last sunday of october dst endsI shall not concern myself with the vargaries of dst in the 70stime_zone 是时区数,比如中国北京是+8区,time_zone = 8seonds 是从1970年1月1日utc时间0时0分0秒到某一时刻的总秒数正常情况下函数返回指针就是参数指针local_time,非正常情况为null*/my_tm_t *my_localtime(unsigned long seonds, my_tm_t *local_time, int time_zone) {register unsigned long local_seconds = seonds + 60 * 60 * time_zone; register my_tm_t *temp;register my_tm_t gmttime; register int isdst=0, sn_mday;if ((temp = my_gmtime(local_seconds, &gmttime))==NULL){return(NULL);}temp = &gmttime;if (temp->tm_mon<=2 || temp->tm_mon>=10)/*March or before or Nov or after */{isdst=0;}else if ( temp->tm_mon!=3 && temp->tm_mon!=9 ) /* between may and Sept */{isdst=1;}else if ( temp->tm_mon==9 ) { /* october */sn_mday=temp->tm_mday-temp->tm_wday;while ( sn_mday+7 <=31 ) sn_mday +=7;if ( temp->tm_mday<sn_mday ){isdst=1;}else if ( temp->tm_mday==sn_mday && temp->tm_hour<2 ){isdst=1;}}else if ( temp->tm_year<87 ) { /* april, before 87 */sn_mday=temp->tm_mday-temp->tm_wday;while ( sn_mday+7 <=31 ) sn_mday +=7;if ( temp->tm_mday>sn_mday ){isdst=1;}else if ( temp->tm_mday==sn_mday && temp->tm_hour>=2 ){isdst=1;}} else { /* april, after 87 */sn_mday=temp->tm_mday-temp->tm_wday+7;while ( sn_mday-7 > 1 ) sn_mday -=7;if ( temp->tm_mday>sn_mday ){isdst=1;}else if ( temp->tm_mday==sn_mday && temp->tm_hour>=2 ){isdst=1;}}if(local_time->tm_isdst==0){*local_time = gmttime;temp = local_time;}else{*local_time = gmttime;temp = local_time;temp->tm_isdst = isdst;if ( isdst) {if ( ++(temp->tm_hour)==24 ) {const char mons[]={31,28,31,30,31,30,31,31,30,31,30,31};temp->tm_hour=0;++(temp->tm_yday); /* can't overflow dst not on Dec. 31 */if ( ++(temp->tm_wday)==7 ){temp->tm_wday=0;}if ( ++(temp->tm_mday)>mons[temp->tm_mon] ) {temp->tm_mday=1;++(temp->tm_mon); /* can't overflow dst not on Dec. 31 */}}}}return( temp );}int main(int argc, char* argv[]){char StrTime[20];my_tm_t gmt;my_tm_t local;if(my_gmtime((unsigned long)time(NULL), &gmt) ==&gmt){sprintf(StrTime,"%04d-%02d-%02d %02d:%02d:%02d", gmt.tm_year+1900, gmt.tm_mon+1, gmt.tm_mday, gmt.tm_hour,gmt.tm_min, gmt.tm_sec);printf("%s\r\n",StrTime);}local.tm_isdst=0;if(my_localtime((unsigned long)time(NULL), &local,8) ==&local){sprintf(StrTime,"%04d-%02d-%02d %02d:%02d:%02d", local.tm_year+1900, local.tm_mon+1, local.tm_mday, local.tm_hour,local.tm_min, local.tm_sec);printf("%s\r\n",StrTime);}local.tm_isdst=1;if(my_localtime((unsigned long)time(NULL), &local,8) ==&local){sprintf(StrTime,"%04d-%02d-%02d %02d:%02d:%02d", local.tm_year+1900, local.tm_mon+1, local.tm_mday, local.tm_hour,local.tm_min, local.tm_sec);printf("%s\r\n",StrTime);}local.tm_isdst=-1;if(my_localtime((unsigned long)time(NULL), &local,8) ==&local){sprintf(StrTime,"%04d-%02d-%02d %02d:%02d:%02d", local.tm_year+1900, local.tm_mon+1, local.tm_mday, local.tm_hour,local.tm_min, local.tm_sec);printf("%s\r\n",StrTime);} return 0;}
以上代码摘自编译器,可以解燃眉之急。
问题又来了,seconds 是从1970年1月1日utc时间0时0分0秒到某一时刻的总秒数,这个总秒数如何计算呢?
码海拾贝 date&time 后续mktime将要上场啦!
- 没有gmttime&localtime api调用,怎么办?
- 调用deleteRowsAtIndexPaths没有刷新表格怎么办?
- 上传压缩好的zip包到appstore时,说调用私有API:UICreateCGImageFromIOSurface,但搜索了下,没有发现哪有有调用,怎么办啊
- 没有怎么办
- localtime()
- localtime
- (转载)C++两次调用localtime函数出错
- localtime 2次连续调用问题
- 没有DOS我们怎么办
- 《没有你我怎么办》
- 没有Google,我们怎么办?
- 没有积分了,怎么办。。。
- SM59没有权限怎么办
- 没有积分怎么办呢?、
- 耳机没有声音怎么办
- 没有分了,怎么办?
- Debian没有sudo怎么办
- 做事没有动力怎么办?
- 入职菜鸟从“Hello World” 开始,水滴石穿。
- 5月份最受欢迎的 14 个新的 jQuery 插件
- 动态规划——Hdu_1003_Max Sum
- 利用谷歌接口实现基站定位
- 10 个基于 jQuery 的 Web 交互插件推荐
- 没有gmttime&localtime api调用,怎么办?
- UltraEdit使用技巧
- 详解CCProgressTimer 进度条并修改cocos2d源码实现“理想”游戏进度条!
- 海量数据处理专题(一、二、三)
- uva 101 - The Blocks Problem
- keyCode
- 企业信息化
- 三十、Java图形化界面设计——布局管理器之BorderLayout(边界布局)
- MFC 中 UpdateData()用法