C/C++输入两个任意日期求相隔天数
将两个日期转换成与一个指定日期(例1970-01-01)之间的差然后计算
思路:
两个日期相隔天数的计算,首先可以将两个日期转换成time_t(从指定日期至1970年1月1日0时0分0秒相隔的秒数),然后计算两个time_t的秒数差,最后用此秒数差除以24*3600秒就可以得到相隔的天数。所以程序中需要建立两个函数,一个是将日期转换成time_t的函数,一个是计算日期相隔天数的函数。
例:
1)建立程序的主体结构:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<time.h>
int get_days(const char* from, const char* to);
time_t convert(int year,int month,int day);
int main()
{
const char* from="2013-3-15";
const char* to="2015-8-14";
int days=get_days(from,to);
printf("From:%s\nTo:%s\n",from,to);
printf("%d\n",days);
system("pause");
return ;
}
get_days函数是计算两个日期相隔天数的主要函数,主要实现从字符串中提取相应的数据和最后差值的计算;convert函数主要是将日期转换成秒值。两个函数的关系是get_day将会调用convert。
2)convert函数的实现:
time_t convert(int year,int month,int day)
{
tm info={};
info.tm_year=year-;
info.tm_mon=month-;
info.tm_mday=day;
return mktime(&info);
}
这里需要使用的是一个tm的结构体,该结构体包含很多信息,其中最为重要的就是年、月、日、时、分、秒。还有一个重要的内部函数就是mktime该函数可以将tm结构体转换成秒值也就是time_t类型。函数主要实现的方法就是新建一个tm结构体,然后将所有项赋值为0,再将年月日更新入tm结构体,最后使用mktime函数计算秒值并返回。
3)get_days函数的实现:
int get_days(const char* from, const char* to)
{
int year,month,day;
sscanf(from,"%d-%d-%d",&year,&month,&day);
int fromSecond=(int)convert(year,month,day);
sscanf(to,"%d-%d-%d",&year,&month,&day);
int toSecond=(int)convert(year,month,day);
return (toSecond-fromSecond)//;
}
这个函数最为重要的就是使用sscanf命令完成字符串中数字部分的获取。一旦获取到年月日再代入函数convert就可计算出秒值,最后将两个秒值相减再除以一天的秒数即可得到结果。
完整程序:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<time.h>
int get_days(const char* from, const char* to);
time_t convert(int year, int month, int day); int main()
{
const char* from = "2013-3-15";
const char* to = "2015-8-14";
int days = get_days(from, to);
printf("From:%s\nTo:%s\n", from, to);
printf("%d\n", days);
system("pause");
return ;
} time_t convert(int year, int month, int day)
{
tm info = {};
info.tm_year = year - ;
info.tm_mon = month - ;
info.tm_mday = day;
return mktime(&info);
} int get_days(const char* from, const char* to)
{
int year, month, day;
sscanf(from, "%d-%d-%d", &year, &month, &day);
int fromSecond = (int) convert(year, month, day);
sscanf(to, "%d-%d-%d", &year, &month, &day);
int toSecond = (int) convert(year, month, day);
return (toSecond - fromSecond) / / ;
}
直接计算
思路:
比如输入2001/03/23--2013/12/11,分成三段,2001/03/23--2001/12/31,2002年初到2012年底,2013/01/01--2013/12/11.只要判断第二段中是否有闰年即可。
代码:
//是否闰年
bool IsLeapYear(int y)
{
return ((y%==&&y%!=)||(y%)==);
} //今年已过的天数(从1月1日算起)
int GetNowDays(int y,int m,int d)
{
int days=;
switch(m-)
{
case :
days+=days+;
case :
days+=days+;
case :
days+=days+;
case :
days+=days+;
case :
days+=days+;
case :
days+=days+;
case :
days+=days+;
case :
days+=days+;
case :
days+=days+;
case :
if(IsLeapYear(y))
days+=;
else
days+=;
case :
days+=;
default:
days+=d;
break;
}
return days;
} //今年剩余天数
int GetRemainDays(int y,int m,int d)
{
if(IsLeapYear(y))
return (-GetNowDays(y,m,d));
else
return (-GetNowDays(y,m,d));
} //日期格式为yyyy-mm-dd
//求两个日期之间的相隔天数
int GetExDays(const char* bgDate,const char* exDate)
{
if(bgDate==NULL||exDate==NULL)
return ;
if(strcmp(bgDate,exDate)>)
return ;
int by,bm,bd,ey,em,ed;
int days=;
sscanf(bgDate,"%d-%d-%d",&by,&bm,&bd);
sscanf(exDate,"%d-%d-%d",&ey,&em,&ed); if(ey-by>=)
{
days+=((ey-(by+))/)*(*+);
int tmp=(ey-(by+))%;
for(int i=;i<=tmp;++i)
{
if(IsLeapYear(by+))
days+=;
else
days+=;
}
days+=(GetRemainDays(by,bm,bd)+GetNowDays(ey,em,ed));
}else
{
days+=(GetNowDays(ey,em,ed)-GetNowDays(by,bm,bd));
}
return days;
}
转载请注明出处:http://www.cnblogs.com/fnlingnzb-learner/p/7054503.html
C/C++输入两个任意日期求相隔天数的更多相关文章
- ytu 1057: 输入两个整数,求他们相除的余数(带参的宏 + 模板函数 练习)
1057: 输入两个整数,求他们相除的余数 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 177 Solved: 136[Submit][Status ...
- Java计算两个字符串日期之间的天数差
Java计算两个字符串日期之间的天数差 调用方法: public static void main(String[] args) throws ParseException { String a = ...
- javascript中计算两个时间日期间隔的天数
<script> /* 计算两个日期的时间间隔天数 */ //时间字符串的格 ...
- 比较两个data日期之间的天数相差
先将字符串转化为Date类型 转化方式参看:http://blog.csdn.net/caoyinghui1986/archive/2008/04/18/2303570.aspx 然后在调用Date. ...
- js-获取两个字符串日期的相隔周
例如说"2017-04-01 23:00:00"是周六, "2017-04-28 23:00:00"是周五,包含各自所在的那一周,我真正需要获得的结果是5个周. ...
- c#(asp.net) 如何计算两个日期之间相隔天数
1.DateTime t1 = Convert.ToDateTime("2006-1-6"); DateTime t2 = Convert.ToDateTime("200 ...
- C#计算两个日期的相隔天数
DateTime start = Convert.ToDateTime(dateStart.ToShortDateString()); DateTime end = Convert.ToDateTim ...
- c++作业:输入两个整数,用函数求两数之和。函数外部声明有什么作用?
#include <iostream> using namespace std; int main(){ //求两数的和? int a,b,s; cout<<"请你输 ...
- 输入两个整数n 和m,从数列1,2,3.......n 中任意取几个数, 使其和等于m ,要求将当中全部的可能组合列出来
中兴面试题之中的一个.难度系数中. 题目描写叙述例如以下:输入两个整数n 和m,从数列1,2.3.......n 中任意取几个数, 使其和等于m ,要求将当中全部的可能组合列出来. 逻辑分析: 1.比 ...
随机推荐
- 基于Struts2的SpringMVC入门
1.SpringMVC概述 (1)SpringMVC为表现层提供基础的基于MVC设计理念的优秀Web框架, (2)SpringMVC通过一套mvc的注解,让POJO成为处理请求的控制器,而无需任何接口 ...
- jQuery选择器---基本选择器总结
今天要跟大家分享一下jQuery选择器的使用方法,它的选择器分为四大类 如图: 基本选择器的使用: 1.id选择器 案例: <div id="notMe"><p& ...
- 漫话JavaScript与异步·第二话——Promise:一诺千金
一.难以掌控的回调 我在第一话中介绍了异步的概念.事件循环.以及JS编程中可能的3种异步情况(用户交互.I/O.定时器).在编写异步操作代码时,最直接.也是每个JSer最先接触的写法一定是回调函数(c ...
- 如何用Ettercap实现“中间人攻击”(附下载链接)
什么是“中间人攻击”? 中间人攻击(Man-in-the-Middle Attack,简称“MiTM攻击”)是一种“间接”的入侵攻击,这种攻击模式是通过各种技术手段将受入侵者控制的一台计算机虚拟放置在 ...
- 写给Android App开发人员看的Android底层知识(3)
(七)App启动流程第2篇 书接上文,App启动一共有七个阶段,上篇文章篇幅所限,我们只看了第一阶段,接下来讲剩余的六个阶段,仍然是拿斗鱼App举例子. 简单回顾一下第一阶段的流程,就是Launche ...
- 《JAVA与模式》之简单工厂模式
在阎宏博士的<JAVA与模式>一书中开头是这样描述简单工厂模式的:简单工厂模式是类的创建模式,又叫做静态工厂方法(Static Factory Method)模式.简单工厂模式是由一个工厂 ...
- 开涛spring3(9.3) - Spring的事务 之 9.3 编程式事务
9.3 编程式事务 9.3.1 编程式事务概述 所谓编程式事务指的是通过编码方式实现事务,即类似于JDBC编程实现事务管理. Spring框架提供一致的事务抽象,因此对于JDBC还是JTA事务都是 ...
- 打开Eclipse弹出“No java virtual machine was found..."的解决方法
今天准备用Eclipse抓取Android应用崩溃log,打开Eclipse时发现运行不了有以下弹框 A Java Runtime Environment(JRE) or Java Developme ...
- SQL写操作 设置内容 (数组转字符串)
SQL写操作 设置内容 (数组转字符串) SQL set内容 SQL操作数组转字符串 SQL写操作 set内容 (数组转字符串) [ 封装方法 ] function getSqlSet( $data ...
- 图解Git命令
上面的四条命令在工作目录.暂存目录(也叫做索引)和仓库之间复制文件. ·git add files把当前文件放入暂存区域. ·git commit 给暂存区域生成快照并提交. ·git reset - ...