Chinaunix首页 | 论坛 | 博客
  • 博客访问: 95403
  • 博文数量: 6
  • 博客积分: 153
  • 博客等级: 入伍新兵
  • 技术积分: 95
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-07 20:57
文章分类

全部博文(6)

文章存档

2012年(5)

2011年(1)

我的朋友

分类: C/C++

2012-12-05 13:41:05

首先约定:
(1)一周的起始日为周日,最后一天是周六
(2)以1.1所在周为一年的第一周

计算思路:
1.计算出1.1是星期几,记为base;
2.求出今日距1.1的总天数,记为day_add;
3.则nweek = (base + day_add) / 7 + 1(不能整除),nweek即为本周是一年中的第几周;

c语言实现
在这之前,先简单介绍一下C语言中有关时间与日期的函数
有关时间日期的结构体、函数声明都定义在time.h头文件中
tm结构体:

点击(此处)折叠或打开

  1. struct tm { 
  2.     int tm_sec; /*- 取值区间为[0,59] */
  3.     int tm_min; /*- 取值区间为[0,59] */
  4.     int tm_hour; /*- 取值区间为[0,23] */
  5.     int tm_mday; /* 一个月中的日期 - 取值区间为[1,31] */
  6.     int tm_mon; /* 月份(从一月开始,0代表一月)- 取值区间为[0,11] */
  7.     int tm_year; /* 年份,其值等于实际年份减去1900 */
  8.     int tm_wday; /* 星期–取值区间为[0,6],其中0代表星期天,1代表星期一,以此类推 */
  9.     int tm_yday; /* 从每年的1月1日开始的天数 – 取值区间为[0,365],其中0代表1月1日,1代表1月2日,以此类推 */
  10.     int tm_isdst; /*夏令时标识符,实行夏令时的时候,tm_isdst为正。不实行夏令时的进候,tm_isdst为0;不了解情况时,tm_isdst()为负。*/
  11. };
ANSI C标准称使用tm结构的这种时间表示为分解时间(broken-down time)。

相关函数

time_t time(time_t * timer);
获取日历时间(从一个标准时间点到此时的时间经过的秒数,一般选用1970年1月1日0时0分0秒标准时间点)
time_t实际为长整型

struct tm * gmtime(const time_t *timer);                                         
struct tm * localtime(const time_t * timer);
这两个函数将日历时间(即一个长整型数)转换成我们平常看见的年月日时分秒tm结构体
这两个函数的区别是gmtime将日历时间转换成时间标准时间(UTC),localtime将日历时间转换成本地时间。


点击(此处)折叠或打开

  1. //计算本周是一年中的第几周
  2. //周日为一周的第一天
  3. #include <stdio.h>
  4. #include <time.h>

  5. int main()
  6. {
  7.     int nweek = 0;
  8.     int wd = 0;
  9.     int yd = 0;
  10.     time_t t; /*声明time_t结构体 t 。*/
  11.     struct tm *ptr; /*声明tm结构体指针。*/

  12.     time(&t); /*初始化time_t结构体t 。*/
  13.     ptr = gmtime(&t); /*获得已初始化的tm结构体。*/

  14.     wd = ptr->tm_wday; /*今天是星期几。*/
  15.     yd = ptr->tm_yday; //今天是今年的第几天 范围0-365 所以yd也表示今天距1月1日的总天数

  16.     //计算本年1月1日是周几
  17.     int base = 7 - (yd + 1 - (wd + 1)) % 7;//yd+1表示到今天的总天数 wd+1表示到今天本周的总天数
  18.     if (base == 7)
  19.         base = 0; //0代表周日 一周的开始

  20.     //计算本周是一年的第几周
  21.     nweek = (base + yd) / 7 + 1;
  22.     printf("\n从1月1日算起今周是第 %d 周。\n", nweek);

  23.     return 0;
  24. }
其实还有许多简便的方法计算这个问题,如:
1、使用EXCEL函数
在单元格中输入 =WEEKNUM(NOW())
WEEKNUM 函数将 1 月 1 日所在的周视为一年中的第一周
2、VBS脚本


点击(此处)折叠或打开

  1. Wscript.Echo "本周是今年的第【" & DatePart("ww", Date) & "】周"
将上面这语句复制到记事本中,另存为.vbs文件,双击运行即可得出结果。
阅读(17511) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~