Skip to content

C语言学习——计算某年某月某日是星期几的函数

2010 五月 10
tags: ,
by 荒野无灯

这个事情如果要用PHP来实现,那是相当简单的事。 :mrgreen:
GOOGLE了一下网上的解决办法,发现都讲得相当复杂,有的甚至涉及到相当复杂的算法。今天看《Pointers on C》一书,里面的一句话提醒了我。

此代码在MS VC++ 2008 下面通过编译。

mktime函数用于把一个tm结构转换为一个time_t的值。

1
time_t mktime(struct tm *tm_ptr);

tm结构中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
printf("%d\n",sizeof("星期六"));  //结果是7

喜欢这篇文章吗?

请订阅本站 RSS feed填写您的邮件地址,订阅我们的精彩内容:,欢迎点击这里捐赠以支持荒野无灯转播到腾讯微博 转播到腾讯微博

作者:荒野无灯
出处:Hacklog【Hacklog】

声明: 本站遵循 署名-非商业性使用-相同方式共享 3.0 共享协议. 转载请注明转自Hacklog【荒野无灯weblog】

本文链接: http://ihacklog.com/?p=3800

4 Responses Post a comment
  1. 六月 18, 2010

    新建站,过来转转,学习语言的,前来看看!说实话,专门写C方面的独立博客很少!除了那些CSDN的大牛们…… :mrgreen:

  2. 五月 13, 2010

    先学完基础再来。

  3. 五月 10, 2010

    C..飘过。。使劲飘。

    PS:我不喜欢在FEED里只能看到个文章开头。。呼。

Leave a Reply

Allowed Tags - You may use these HTML tags and attributes in your comment.

<a href="" title=""> <abbr title=""> <acronym title=""> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <q cite=""> <strong>

 :wink:  :-|  :-x  :twisted:  :)  8-O  :(  :roll:  :-P  :oops:  :-o  :mrgreen:  :lol:  :idea:  :-D  :evil:  :cry:  8)  :arrow:  :-?  :?:  :!:

Note: You may use basic HTML in your comments. Your email address will not be published.

Subscribe to this comment feed via RSS

欢迎您 点击这里 订阅我的博客 o(∩_∩)o ~~~ x