为什么我的代码只支持东八区?

发布于 2022-07-22 11:48:38 字数 9787 浏览 9 评论 3

  1. #include <time.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. //write by rwx_hc mail:wsjhhc@gmail.com;wsjhhc@tom.com;wsjhhc@hotmail.com
  5. int main(int argc,char *argv[])
  6. {
  7. //time
  8. time_t timep;
  9. struct tm *tp;
  10. //split the input date
  11. char *delim="-";
  12. char *pY,*pM,*pD;
  13. int intY,intM,intD;
  14. //default parameter
  15. int iAdd=0;
  16. char cFormat[]="a";
  17. int m,i,j;
  18. int k=0;
  19. long iSumDays=0;
  20. time(&timep);
  21. //define parameters
  22. for(m=1;m<argc;m+=2)
  23. {
  24.    switch(argv[m][1])
  25.     {
  26.         case 'h':   
  27.         {
  28.             printf("usage:my_date_add [-h|--help][-d <date>][-n <days>][-f <a|y|m|d|x|X]>n");
  29.             printf("for example:n");
  30.             printf("my_date_add -d 2006-5-28 -n -1 -f atoutput:2006-5-27n");
  31.             printf("my_date_add -d 2006-5-28 -f ytoutput:2006n");
  32.             printf("my_date_add -f mtoutput:5n");
  33.             printf("my_date_add -f dtoutput:28n");
  34.             printf("my_date_add -f xtoutput:5-28n");
  35.             return 0;
  36.         }break;
  37.         case 'n':iAdd=atoi(argv[m+1]);break;
  38.         case 'f':cFormat[0]=(argv[m+1][0]);break;
  39.         case 'd':
  40.         {
  41.             pY=strtok(argv[m+1],delim);
  42.             pM=strtok(NULL,delim);
  43.             pD=strtok(NULL,delim);
  44.             //converts strings to int
  45.             intY=atoi(pY);
  46.             intM=atoi(pM);
  47.             intD=atoi(pD);
  48.                
  49.             for(i=1970;i<=(intY-1);i++)//365 or 366
  50.             {
  51.                 if((i%4==0 && i%100!=0) || i%400==0) k++;
  52.             }
  53.           for(j=1;j<=(intM - 1);j++)//the last year's days
  54.             {
  55.             switch(j)
  56.                {
  57.                case 1:iSumDays+=31;break;
  58.                case 3:iSumDays+=31;break;
  59.                case 5:iSumDays+=31;break;
  60.                case 7:iSumDays+=31;break;
  61.                case 8:iSumDays+=31;break;
  62.                case 10:iSumDays+=31;break;
  63.                case 12:iSumDays+=31;break;
  64.                case 4:iSumDays+=30;break;
  65.                case 6:iSumDays+=30;break;
  66.                case 9:iSumDays+=30;break;
  67.                case 11:iSumDays+=30;break;
  68.                case 2:
  69.                 {
  70.                    if((intY%4==0 && intY%100!=0) || intY%400==0)
  71.                     iSumDays+=29;
  72.                    else
  73.                     iSumDays+=28;
  74.                 }break;
  75.                 }
  76.             }
  77.                
  78.             iSumDays += intD;
  79.             iSumDays += (intY - 1970) * 365 + k;
  80.             timep = iSumDays * 86400 - 86400;//1970--inputDay pass seconds
  81.                
  82.         }break;
  83.         default:
  84.         {
  85.             printf("usage:my_date_add [-h|--help][-d <date>][-n <days>][-f <a|y|m|d|x|X]>n");
  86.             printf("for example:n");
  87.             printf("my_date_add -d 2006-5-28 -n -1 -f atoutput:2006-5-27n");
  88.             printf("my_date_add -d 2006-5-28 -f ytoutput:2006n");
  89.             printf("my_date_add -f mtoutput:5n");
  90.             printf("my_date_add -f dtoutput:28n");
  91.             printf("my_date_add -f xtoutput:5-28n");
  92.             return 0;
  93.         }
  94.         break;
  95.         }         
  96.     }
  97. //get time_t,tm
  98. timep = timep + 86400 * iAdd;   
  99. tp = gmtime(&timep);
  100. switch(cFormat[0])
  101. {
  102.     case 'a':
  103.     {
  104.         printf("%d-%d-%dn",1900 + tp->tm_year,1 + tp->tm_mon,tp->tm_mday);
  105.         return 0;
  106.     }break;
  107.     case 'y':
  108.     {
  109.         printf("%dn",1900 + tp->tm_year);
  110.         return 0;
  111.     }break;
  112.     case 'm':
  113.     {
  114.         printf("%dn",1 + tp->tm_mon);
  115.         return 0;
  116.     }break;
  117.     case 'd':
  118.     {
  119.         printf("%dn",tp->tm_mday);
  120.         return 0;
  121.     }break;
  122.     case 'x':
  123.     {
  124.         printf("%d-%dn",1 + tp->tm_mon,tp->tm_mday);
  125.         return 0;
  126.     }break;
  127.     case 'X':
  128.     {
  129.         printf("%d_%dn",1 + tp->tm_mon,tp->tm_mday);
  130.         return 0;
  131.     }break;
  132. }
  133. return 0;
  134. }

复制代码

写了一个脚本测试:

  1. #!/bin/sh
  2. #timezone_test
  3. date +'%Y-%m-%d %H:%M' >>/root/tmp/rwx/timezone_test.log
  4. /root/tmp/rwx/rwx_date_add -n 0 >>/root/tmp/rwx/timezone_test.log
  5. /root/tmp/rwx/rwx_date_add >>/root/tmp/rwx/timezone_test.log
  6. /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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

最偏执的依靠 2022-07-24 22:24:16

localtime

小忆控 2022-07-24 22:23:15

程序默认输出时区为UTC而系统时区是CST+8:00
date +'%Z %z'    输出为 CST +0800

不顾 2022-07-24 17:09:41

see /etc/localtime /usr/share/zoneinfo

/etc/localtime 是一个指向 /usr/share/zoneinfo 下某个时区文件的链接

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文