Chinaunix首页 | 论坛 | 博客
  • 博客访问: 223674
  • 博文数量: 28
  • 博客积分: 398
  • 博客等级: 一等列兵
  • 技术积分: 1109
  • 用 户 组: 普通用户
  • 注册时间: 2011-01-07 22:28
文章分类
文章存档

2017年(1)

2014年(3)

2013年(7)

2012年(4)

2011年(13)

分类: LINUX

2011-11-04 17:11:27

  1. c语言中对日期做加减操作非常不方便,不想c++有现成的类可以使用。
  2. 以下是通过c的方式写的一个计算函数,可以加减日期。
  3. (没有经过严格测试,如有问题,请指出,谢谢。)

  4. /**
  5.  *时间计算 例如 ( 2011-10-12 11:00:00 ) +( 00-14-10 03:00:00 ) = (2012-12-22 14:00:38)
  6.  @param old_time 参与运算的时间
  7.  @param offset 需要加减的偏移值
  8.  @param is_add 操作 (0:对时间做减法操作,1:做加法操作)
  9.  @return 返回计算的结果时间
  10.  */
  11. struct tm clac_time( struct tm old_time, struct tm offset, int is_add )
  12. {
  13.     int year_day[2][12] = {{31,28,31,30,31,30,31,31,30,31,30,31},
  14.         {31,29,31,30,31,30,31,31,30,31,30,31}};
  15.     time_t old_sec = mktime( &old_time ); //距离1900-1-1的秒数

  16.     /*加上1900,计算的闰年才是准确的*/
  17.     old_time.tm_year += 1900;
  18.     old_time.tm_mon += 1;

  19.     int is_leap_year = 0, day_count = 0;
  20.     size_t time_second_counts = 0; /*偏差的秒数*/
  21.     /*先计算年月,得出相差的天数*/
  22.     int offset_mon = offset.tm_year * 12 + offset.tm_mon;
  23.     int year = old_time.tm_year;
  24.     int mon = old_time.tm_mon;
  25.     while ( offset_mon > 0 )
  26.     {
  27.         if ( is_add > 0 )
  28.         {
  29.             mon++;
  30.             if ( mon > 12 )
  31.             {
  32.                 mon = 1;
  33.                 year++;
  34.             }

  35.             if ( (year%400==0) || ( (year%100!=0) && (year%4==0) ) )
  36.                 is_leap_year = 1;
  37.             else
  38.                 is_leap_year = 0;

  39.             /*加的是上个月的天数*/
  40.             int index = ( mon == 1 ) ? 11:(mon-2);
  41.             day_count += year_day[is_leap_year][index];
  42.         }
  43.         else
  44.         {
  45.             mon--;
  46.             if ( mon < 1)
  47.             {
  48.                 mon = 12;
  49.                 year--;
  50.             }

  51.             if ( (year%400==0) || ( (year%100!=0) && (year%4==0) ) )
  52.                 is_leap_year = 1;
  53.             else
  54.                 is_leap_year = 0;

  55.             /*减的是上个月的天数*/
  56.             int index = ( mon == 1 ) ? 11:(mon-2);
  57.             day_count += year_day[is_leap_year][index];
  58.         }

  59.         offset_mon--;
  60.     }
  61.     time_second_counts += (day_count * 24 * 60 * 60);

  62.     /*然后加上剩下的 日时分秒 */
  63.     time_second_counts += ( offset.tm_mday* 24 * 60 * 60 +
  64.             offset.tm_hour * 60 * 60 +
  65.             offset.tm_min * 60 + offset.tm_sec );

  66.     if ( is_add > 0 )
  67.         old_sec += time_second_counts ;
  68.     else
  69.         old_sec -= time_second_counts ;

  70.     struct tm result;
  71.     localtime_r(&old_sec, &result);

  72.     return result;
  73. }
阅读(2662) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~