栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

用c/c++混合编程方式为ios/android实现一个自绘日期选择控件(一B)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

用c/c++混合编程方式为ios/android实现一个自绘日期选择控件(一B)

2) 日期操作函数:
这些函数都和日期操作相关,具体请参考代码,注释应该比较清楚的。

void date_set(SDate* ret,int year,int month,int day)
{
   assert(ret);
   ret->year = year;
   ret->month = month;
   ret->day = day;
}


void date_get_now(SDate* ret)
{
   assert(ret);

   //time()此函数会返回从公元 1970 年1 月1 日的UTC 时间从0 时0 分0 秒算起到现在所经过的秒数。
   //记住:是秒数,而不是毫秒数(很多语言返回的是毫秒数,crt中是以秒为单位的)
   //如果t 并非空指针的话,此函数也会将返回值存到t指针所指的内存
   time_t t;
   time(&t);

   //转换到当前系统的本地时间
   struct tm* timeInfo;
   timeInfo = localtime(&t);

   //tm结构中的年份是从1900开始到今天的年数,因此需要加上1900
   ret->year  =  timeInfo->tm_year + 1900;

   //月份是 0 base的,我们按照1-12的方式来计算,因此加1
   ret->month =  timeInfo->tm_mon + 1;

   ret->day   =  timeInfo->tm_mday;
}


bool date_is_equal(const SDate* left,const SDate* right)
{
   assert(left&&right);
   return (left->year == right->year &&
    left->month == right->month &&
    left->day == right->day);
}


int date_get_month_count_from_year_range(int startYear,int endYear)
{
   int diff = endYear - startYear + 1;
   return diff * 12;
}


void date_map_index_to_year_month(SDate* to,int startYear,int idx)
{
   assert(to);

   //每年有12个月,idx/12你可以看成每12个月进一位,加上startYear基准值,就可以获得当前年份
   to->year = startYear + idx / 12;

   //每年有12个月,idx%12你可以看成【0-11】之间循环,加1是因为我们的SDate结构是1-12表示的
   to->month = idx % 12 + 1;

   //至于day,这里为-1,我们在map中忽略该值,可以设置任意值
   to->day = -1;
}


long mymktime (unsigned int year, unsigned int mon,
 unsigned int day, unsigned int hour,
 unsigned int min, unsigned int sec)
{
   if (0 >= (int) (mon -= 2)) {    
      mon += 12;      
      year -= 1;
   }

   return (((
      (long) (year/4 - year/100 + year/400 + 367*mon/12 + day) +
      year*365 - 719499
     )*24 + hour 
    )*60 + min 
   )*60 + sec; 
}



long date_get_time_t(const SDate* d)
{
    assert(d);

    

    

     
     return mymktime(d->year,d->month,d->day,0,0,1);
}


void date_get_prev_month(SDate* date, int delta)
{
   assert(date);

   if((date->month - delta) < 1)
   {
      //条件: 假设为2015年1月,delta = 2
      //因为: 1-2 = -1 < 1
      //所以: 年数 = 2015 - 1 = 2014 月份 = 12 + 1 - 2 = 11
      date->year--;
      date->month = 12 + date->month - delta;
   }
   else
      date->month = date->month - delta;
}


void date_get_next_month(SDate* date, int delta)
{
   assert(date);
   if((date->month + delta) > 12)
   {
      //条件: 假设为2015年11月,delta = 2
      //因为: 11 + 2 = 13 > 12
      //所以: 年数 = 2015 + 1 = 2016 月份 = 11 + 2 - 12 = 1
      date->year++;
      date->month = date->month + delta - 12;
   }
   else
      date->month = date->month + delta;
}


int date_get_leap(int year)
{
   if(((year % 4 == 0) && (year % 100) != 0)  (year % 400 == 0))
      return 1;
   return 0;
}


int date_get_days(const SDate* date)
{
   assert(date);
   int day_table[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
   int i = 0, total = 0;
   for(i = 0; i < date->month; i++)
      total += day_table[i];
   return total + date->day + date_get_leap(date->year);
}


int date_get_week(const SDate* date)
{
   assert(date);
   return ((date->year - 1 + (date->year - 1) / 4 - (date->year - 1) / 100 +
     (date->year - 1) / 400 + date_get_days(date) )% 7);
}


int date_get_month_of_day(int year, int month)
{
   switch(month)
   {
      case 1:
      case 3:
      case 5:
      case 7:
      case 8:
      case 10:
      case 12: return 31;
      case 4:
      case 6:
      case 9:
      case 11: return 30;
   }
   //blf:2月比较特别,要进行闰年判断
   return 28 + date_get_leap(year);
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/233132.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号