为什么我的代码只支持东八区?
- #include <time.h>
- #include <string.h>
- #include <stdlib.h>
- //write by rwx_hc mail:wsjhhc@gmail.com;wsjhhc@tom.com;wsjhhc@hotmail.com
- int main(int argc,char *argv[])
- {
- //time
- time_t timep;
- struct tm *tp;
- //split the input date
- char *delim="-";
- char *pY,*pM,*pD;
- int intY,intM,intD;
- //default parameter
- int iAdd=0;
- char cFormat[]="a";
- int m,i,j;
- int k=0;
- long iSumDays=0;
- time(&timep);
- //define parameters
- for(m=1;m<argc;m+=2)
- {
- switch(argv[m][1])
- {
- case 'h':
- {
- printf("usage:my_date_add [-h|--help][-d <date>][-n <days>][-f <a|y|m|d|x|X]>n");
- printf("for example:n");
- printf("my_date_add -d 2006-5-28 -n -1 -f atoutput:2006-5-27n");
- printf("my_date_add -d 2006-5-28 -f ytoutput:2006n");
- printf("my_date_add -f mtoutput:5n");
- printf("my_date_add -f dtoutput:28n");
- printf("my_date_add -f xtoutput:5-28n");
- return 0;
- }break;
- case 'n':iAdd=atoi(argv[m+1]);break;
- case 'f':cFormat[0]=(argv[m+1][0]);break;
- case 'd':
- {
- pY=strtok(argv[m+1],delim);
- pM=strtok(NULL,delim);
- pD=strtok(NULL,delim);
- //converts strings to int
- intY=atoi(pY);
- intM=atoi(pM);
- intD=atoi(pD);
- for(i=1970;i<=(intY-1);i++)//365 or 366
- {
- if((i%4==0 && i%100!=0) || i%400==0) k++;
- }
- for(j=1;j<=(intM - 1);j++)//the last year's days
- {
- switch(j)
- {
- case 1:iSumDays+=31;break;
- case 3:iSumDays+=31;break;
- case 5:iSumDays+=31;break;
- case 7:iSumDays+=31;break;
- case 8:iSumDays+=31;break;
- case 10:iSumDays+=31;break;
- case 12:iSumDays+=31;break;
- case 4:iSumDays+=30;break;
- case 6:iSumDays+=30;break;
- case 9:iSumDays+=30;break;
- case 11:iSumDays+=30;break;
- case 2:
- {
- if((intY%4==0 && intY%100!=0) || intY%400==0)
- iSumDays+=29;
- else
- iSumDays+=28;
- }break;
- }
- }
- iSumDays += intD;
- iSumDays += (intY - 1970) * 365 + k;
- timep = iSumDays * 86400 - 86400;//1970--inputDay pass seconds
- }break;
- default:
- {
- printf("usage:my_date_add [-h|--help][-d <date>][-n <days>][-f <a|y|m|d|x|X]>n");
- printf("for example:n");
- printf("my_date_add -d 2006-5-28 -n -1 -f atoutput:2006-5-27n");
- printf("my_date_add -d 2006-5-28 -f ytoutput:2006n");
- printf("my_date_add -f mtoutput:5n");
- printf("my_date_add -f dtoutput:28n");
- printf("my_date_add -f xtoutput:5-28n");
- return 0;
- }
- break;
- }
- }
- //get time_t,tm
- timep = timep + 86400 * iAdd;
- tp = gmtime(&timep);
- switch(cFormat[0])
- {
- case 'a':
- {
- printf("%d-%d-%dn",1900 + tp->tm_year,1 + tp->tm_mon,tp->tm_mday);
- return 0;
- }break;
- case 'y':
- {
- printf("%dn",1900 + tp->tm_year);
- return 0;
- }break;
- case 'm':
- {
- printf("%dn",1 + tp->tm_mon);
- return 0;
- }break;
- case 'd':
- {
- printf("%dn",tp->tm_mday);
- return 0;
- }break;
- case 'x':
- {
- printf("%d-%dn",1 + tp->tm_mon,tp->tm_mday);
- return 0;
- }break;
- case 'X':
- {
- printf("%d_%dn",1 + tp->tm_mon,tp->tm_mday);
- return 0;
- }break;
- }
- return 0;
- }
复制代码
写了一个脚本测试:
- #!/bin/sh
- #timezone_test
- date +'%Y-%m-%d %H:%M' >>/root/tmp/rwx/timezone_test.log
- /root/tmp/rwx/rwx_date_add -n 0 >>/root/tmp/rwx/timezone_test.log
- /root/tmp/rwx/rwx_date_add >>/root/tmp/rwx/timezone_test.log
- /root/tmp/rwx/rwx_date_add -n -1 >>/root/tmp/rwx/timezone_test.log
复制代码
测试输出:
2006-07-01 04:30
2006-6-30
2006-6-30
2006-6-29
2006-07-01 05:30
2006-6-30
2006-6-30
2006-6-29
2006-07-01 06:30
2006-6-30
2006-6-30
2006-6-29
2006-07-01 07:30
2006-6-30
2006-6-30
2006-6-29
2006-07-01 08:30
2006-7-1
2006-7-1
2006-6-30
应该相差8个小时,请高手赐教!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
localtime
程序默认输出时区为UTC而系统时区是CST+8:00
date +'%Z %z' 输出为 CST +0800
see /etc/localtime /usr/share/zoneinfo
/etc/localtime 是一个指向 /usr/share/zoneinfo 下某个时区文件的链接