这个事情如果要用PHP来实现,那是相当简单的事。 ![]()
GOOGLE了一下网上的解决办法,发现都讲得相当复杂,有的甚至涉及到相当复杂的算法。今天看《Pointers on C》一书,里面的一句话提醒了我。
此代码在MS VC++ 2008 下面通过编译。
mktime函数用于把一个tm结构转换为一个time_t的值。
1tm结构中tm_wday和tm_yday 的值被忽略,其他字段的值也无需限制在它们的通常范围内。在转换之后,该tm结构会进行规格化,因此tm_wday和tm_yday的值将是正确的,其余字段的值也都位于它们通常的范围之内。这个技巧是一种简单的用于判断某个特定的日期属于星期几的方法。
可见实现判断某个特定的日期属于星期几的关键是这个mktime函数啦。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | #include <stdio.h> #include <string.h> #include <tchar.h> #include <time.h> /* C语言计算某年某月某日是星期几的函数 (注:由于 mktime函数的限制,目前只能计算1900年以后到2038年之间的) By 荒野无灯 */ char *day2week(int year,int month,int day) { struct tm tm1,*tm2; time_t timep; //char *ret="unknown"; char *ret; //分配内存空间 ,要包括 NUL 字节 ret=(char *) malloc(6+1); int week; tm1.tm_year= year-1900; tm1.tm_mon=month-1; tm1.tm_mday=day; tm1.tm_hour=12; tm1.tm_min=0; tm1.tm_sec=0; timep=mktime(&tm1); tm2=localtime(&timep); week=(int) (tm2->tm_wday); switch (week) { case 0: strcpy(ret,"星期天");break; case 1: strcpy(ret,"星期一");break; case 2: strcpy(ret,"星期二");break; case 3: strcpy(ret,"星期三");break; case 4: strcpy(ret,"星期四");break; case 5: strcpy(ret,"星期五");break; case 6: strcpy(ret,"星期六");break; } return ret; } int main() { int year,mon,day; printf("请输入年 月 日\n"); scanf("%4d %2d %2d",&year,&mon,&day); printf("%s\n",day2week(year,mon,day)); return 0; } |
另一个版本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | #include "stdafx.h" #include <string.h> #include <tchar.h> #include <time.h> #include <malloc.h> void day2week(int year,int month,int day,char *ret); int _tmain(int argc, _TCHAR* argv[]) { int year,mon,day; char *str; str=(char *) malloc(7); printf("请输入年 月 日\n"); scanf("%4d %2d %2d",&year,&mon,&day); day2week(year,mon,day,str); printf("%s\n",str); return 0; } /* C语言计算某年某月某日是星期几的函数 (注:由于 mktime函数的限制,目前只能计算1900年以后到2038年之间的) By 荒野无灯 */ void day2week(int year,int month,int day,char *ret) { struct tm tm1,*tm2; time_t timep; int week; tm1.tm_year= year-1900; tm1.tm_mon=month-1; tm1.tm_mday=day; tm1.tm_hour=12; tm1.tm_min=0; tm1.tm_sec=0; timep=mktime(&tm1); tm2=localtime(&timep); week=(int) (tm2->tm_wday); switch (week) { case 0: strcpy(ret,"星期天");break; case 1: strcpy(ret,"星期一");break; case 2: strcpy(ret,"星期二");break; case 3: strcpy(ret,"星期三");break; case 4: strcpy(ret,"星期四");break; case 5: strcpy(ret,"星期五");break; case 6: strcpy(ret,"星期六");break; } } |
这里有几点要注意的:
不能用char *ret=”unknown”; 然后再strcpy(ret,”星期几”); 因为unknown实际上是一个字符串常量,ret 相当于一个指向字符串常量的指针,因此*ret是不可修改的。用strcpy企图修改*ret的值是会报错的。
分配内存时要比实际的多一个字节 ,这个字节是留给 NUL 字节的。
1 |
喜欢这篇文章吗?
请订阅本站 RSS feed 或




6:24 下午, 2010年06月18日砖头 /
新建站,过来转转,学习语言的,前来看看!说实话,专门写C方面的独立博客很少!除了那些CSDN的大牛们……
12:26 下午, 2010年05月13日猪八戒 /
先学完基础再来。
6:35 下午, 2010年05月10日simaopig /
C..飘过。。使劲飘。
PS:我不喜欢在FEED里只能看到个文章开头。。呼。
4:40 下午, 2010年05月13日荒野无灯 /
在FEED里只能看到个文章开头
我用GOOGLE READER 貌似没问题啊