📄 ctime.c
字号:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <time.h>
#include <sys/stat.h>
usage(char *procname)
{
printf("Usage:%s -i itime|-s [[[yyyy]mm]dd]hhmmss|-t|-h [-o|-O [format]] [-x days]\n",procname);
printf("功能: 时间戳与时间格式字符串的转换程序\n");
printf(" -i 输入的参数为时间戳\n");
printf(" -s 输入的参数为格式化时间\n");
printf(" -t 输入的时间取当前系统时间\n");
printf(" -x 输入的时间增加或减少的天数\n");
printf(" -o 输出的时间为时间戳格式\n");
printf(" -O 输出的时间为格式化时间\n");
printf(" -h 帮助文件-查看[format]如何定义,例 %s -h\n",procname);
printf("范例:1 取当前日期的前2天的时间显示 %s -t -x -2\n",procname);
printf(" 2 取20030101的前5天的时间显示 %s -s 20030101000000 -x -5\n",procname);
printf(" 3 取20031231的后5天的时间显示 %s -s 20031231000000 -x 5 -O \"%%D %%T\"\n",procname);
printf(" 4 取时间戳为1089619417的时间显示 %s -i 1089619417 \n",procname);
printf(" 5 取时间戳为1089619417的后4天的时间显示 %s -i 1089619417 -x 4 \n",procname);
printf("\n作者:俞旋 2003-05-12\n");
printf("修改日期: 2004-07-12\n");
exit(1);
}
help(char *procname)
{
printf("Usage : %s -i itime|-s [[[yyyy]mm]dd]hhmmss|-t [-o|-O [format]] [-h] [-x days] \n",procname);
printf("格式化参数[format]:\n");
printf(" %%%% same as %%\n");
printf(" %%a abbreviated weekday name\n");
printf(" %%A full weekday name\n");
printf(" %%b abbreviated month name\n");
printf(" %%B full month name\n");
printf(" %%c basic date and time representation\n");
printf(" %%C number of the century (00 - 99)\n");
printf(" %%d day of month (01 - 31)\n");
printf(" %%D date as %%m/%%d/%%y\n");
printf(" %%e day of month (1-31; single digits are preceded by a blank)\n");
printf(" %%E a modifier character used in association\n\t\t with certain conversion specifiers; see below.\n");
printf(" %%h abbreviated month name\n");
printf(" %%H hour (00 - 23)\n");
printf(" %%I hour (01 - 12)\n");
printf(" %%j day number of year (001 - 366)\n");
printf(" %%m month number (01 - 12)\n");
printf(" %%M minute (00 - 59)\n");
printf(" %%n same as new-line\n");
printf(" %%N default date and time representation\n");
printf(" %%O a modifier character used in association\n\t\t with certain conversion specifiers; see below\n");
printf(" %%p equivalent of either AM or PM\n");
printf(" %%r 12-hour time (including %%p)\n");
printf(" %%R same as %%H:%%M\n");
printf(" %%S seconds (00 - 61), allows for leap seconds\n");
printf(" %%t same as a tab\n");
printf(" %%T same as %%H:%%M:%%S\n");
printf(" %%u weekday number (1 - 7), Monday = 1\n");
printf(" %%U week number of year (00 - 53), Sunday is the first day of week 1\n");
printf(" %%V week number of the year\n");
printf(" %%w weekday number (0 - 6), Sunday = 0\n");
printf(" %%W week number of year (00 - 53), Monday is the first day of week 1\n");
printf(" %%x locale's appropriate date representation\n");
printf(" %%X locale's appropriate time representation\n");
printf(" %%y year within century (00 - 99)\n");
printf(" %%Y year as ccyy (for example, 1986)\n");
printf(" %%Z time zone name or no characters if no time zone exists\n");
exit(1);
}
main(int argc,char *argv[])
{
char ch;
char *procname;
int iStart,iFlag,iOutFlag;
int subTime;
time_t iTime;
time_t icurtime;
char *sGetStr;
struct tm *ntm;
struct tm when;
char outstr[256];
char fmtstr[256];
memset(fmtstr,0,sizeof(fmtstr));
iStart=0;
iOutFlag=0;
subTime=0;
procname=argv[0];
while((ch=getopt(argc,argv,"i:s:tx:oO:h"))!=EOF)
switch(ch) {
case 'i':
iStart++;
iFlag=1;
iTime=atoi(optarg);
break;
case 's':
iStart++;
iFlag=2;
sGetStr=optarg;
break;
case 't':
iStart++;
iFlag=3;
break;
case 'x':
subTime=atoi(optarg);
break;
case 'o':
iOutFlag=1;
break;
case 'O':
iOutFlag=2;
strcpy(fmtstr,optarg);
break;
case 'h':
help(procname);
return(1);
break;
default:
break;
}
argc -= optind;
argv += optind;
if (argc!=0||iStart!=1) { usage(procname);return(-1);}
switch(iFlag) {
case 1:
break;
case 2:
iStart=0;
time(&icurtime);
ntm=localtime(&icurtime);
when.tm_year=ntm->tm_year;
when.tm_mon=ntm->tm_mon;
when.tm_mday=ntm->tm_mday;
when.tm_hour=ntm->tm_hour;
when.tm_min=ntm->tm_min;
when.tm_sec=ntm->tm_sec;
if(strlen(sGetStr)==6) {
iStart=6;
when.tm_hour=atoilen(sGetStr,2);
when.tm_min=atoilen(sGetStr+2,2);
when.tm_sec=atoilen(sGetStr+4,2);
}
if(strlen(sGetStr)==8) {
iStart=8;
when.tm_mday=atoilen(sGetStr,2);
when.tm_hour=atoilen(sGetStr+2,2);
when.tm_min=atoilen(sGetStr+4,2);
when.tm_sec=atoilen(sGetStr+6,2);
}
if(strlen(sGetStr)==10) {
iStart=10;
when.tm_mon=atoilen(sGetStr,2)-1;
when.tm_mday=atoilen(sGetStr+2,2);
when.tm_hour=atoilen(sGetStr+4,2);
when.tm_min=atoilen(sGetStr+6,2);
when.tm_sec=atoilen(sGetStr+8,2);
}
if(strlen(sGetStr)==14) {
iStart=14;
when.tm_year=atoilen(sGetStr,4)-1900;
when.tm_mon=atoilen(sGetStr+4,2)-1;
when.tm_mday=atoilen(sGetStr+6,2);
when.tm_hour=atoilen(sGetStr+8,2);
when.tm_min=atoilen(sGetStr+10,2);
when.tm_sec=atoilen(sGetStr+12,2);
}
if(when.tm_year>138||when.tm_year<=70) {printf("时间串年份%d超过限制(1971-2038)\n",when.tm_year+1900); exit(1);}
if(when.tm_mon+1>12||when.tm_mon+1<=0) {printf("时间串月份%d错误\n",when.tm_mon+1); exit(1);}
if(when.tm_mday>31||when.tm_mday<=0) {printf("时间串日期%d错误\n",when.tm_mday); exit(1);}
if(when.tm_hour>23||when.tm_hour<0) {printf("时间串小时%d错误\n",when.tm_hour); exit(1);}
if(when.tm_min>59||when.tm_min<0) {printf("时间串分钟%d错误\n",when.tm_min); exit(1);}
if(when.tm_sec>59||when.tm_sec<0) {printf("时间串秒钟%d错误\n",when.tm_sec); exit(1);}
if(iStart<=0) { printf("时间串长度错误\n");exit(1);}
iTime=mktime(&when);
break;
case 3:
time(&iTime);
break;
}
iTime=iTime + subTime*24*60*60;
switch(iOutFlag) {
case 1:
printf("%d\n",iTime);
break;
case 2:
cftime(outstr, fmtstr,&iTime);
printf("%s\n",outstr);
break;
default:
strcpy(fmtstr,"%Y-%m-%d %T");
cftime(outstr, fmtstr,&iTime);
printf("%s\n",outstr);
break;
}
}
int atoilen(char *Buf,int iLen)
{
int numb;
char strbuf[12];
if (iLen>=12 || iLen<=0) return(-1);
memset(strbuf,0,sizeof(strbuf));
memcpy(strbuf,Buf,iLen);
numb=atoi(strbuf);
return(numb);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -