输入一个日期,判断这个日期在一年中是哪一天,是星期几,计算两个日期间的天数,使用字符串输出日期

之前写了一个博文(http://blog.csdn.net/shiwazone/article/details/45053739)是用基本函数实现的,这次使用类的设计方法,也就是面向对象的方法改写一下,并加入了日期转换成字符串的实现。这里的程序也可以解决编程珠玑习题3.4的问题。

#include"calendar.h"
int main()
{
	Time t;
	t.initialTime();
	t.Show();
	t.StrShow();
	Time t1;
	t1.initialTime();
	t1.StrShow();
	Time t2;
	t2.initialTime();
	t2.StrShow();
	cout << "The days between t1 and t2 is: " << t1.countdays(t2)<<endl;
	cout << "The days between t2 and t1 is: " << t2.countdays(t1)<<endl;
	return 0;
}
#ifndef CANLENDAR_H
#define CANLENDAA_H
#include<iostream>
#include<string>
using namespace std;
string ntos(int t);//数字转换成字符
class Time
{
private:
	int year;
	int month;
	int day;
	unsigned int weekday;
	int Weekdaycount()const;//计算当日是星期几
	int Daycount()const;//计算当日是公元第多少天
	int Daysyearcount()const;//计算当日是该年的第多少天
	bool isleapyear()const;//判断该年是不是闰年
	bool check()const;//检查时间格式是否正确
	void numtostr(string &sy, string &sm, string &sd, string &sw)const;//数字日期转换成字符日期

public:
	void initialTime();//输入初始化时间
	void Show()const;//显示时间信息
	void StrShow()const;//使用字符串的表达显示日期
	int countdays(const Time & t2)const;//计算两个日期间的天数
};
int Time::Weekdaycount()const//计算当日是星期几
{
	return Daycount() % 7;
}
int Time::Daycount()const//计算当日是公元第多少天
{
	int days = 0;
	days = (year - 1) * 365 + (year - 1) / 4 - (year - 1) / 100
		+ (year - 1) / 400 + Daysyearcount();
	return days;
}
int Time::Daysyearcount()const//计算当日是该年的第多少天
{
	int days = 0;
	int mtemp = month - 1;
	while (mtemp > 0)
	{
		switch (mtemp)
		{
		case(1) :
		case(3) :
		case(5) :
		case(7) :
		case(8) :
		case(10) :
		case(12) :
				 days += 31; break;
		case(4) :
		case(6) :
		case(9) :
		case(11) :
				 days += 30; break;
		case(2) :
			days += 28; break;
		default:
			break;
		}
		--mtemp;
	}
	if (isleapyear())++days;//如果是闰年,再加上一天
	return days + day;//返回计算的天数加上当月的天数
}
bool Time::isleapyear()const//判断该年是不是闰年
{
	if (year % 4 == 0 && year % 100 != 0) return true;//年是四的倍数而且不是100的倍数,是闰年
	if (year % 400 == 0)return true;
	else return false;
}
bool Time::check()const//检查时间格式是否正确
{
	if (year <= 0 || (month <= 0 || month>12) || day <= 0) return false;
	else{
		if (( month == 1 ||  month == 3 ||  month == 5 ||  month == 7
			||  month == 8 ||  month == 10 ||  month == 12) &&  day > 31)return false;
		else
		{
			if (( month == 4 ||  month == 6 ||  month == 9 ||  month == 11
				) &&  day > 30)return false;
			else
			{
				if ( month == 2) {
					if (isleapyear()) {
						if ( day > 29)return false; else return true;
					}
					else
					{
						if ( day > 28)return false; else return true;
					}
				}
			}
		}
	}
}
void Time::numtostr(string &sy, string &sm, string &sd, string &sw)const//数字日期转换成字符日期
{
	sy = ntos(year / 1000) + ntos(year / 100 - 10 * (year / 1000))
		+ ntos(year / 10 - 10 * (year / 100)) + ntos(year % 10);
	sd = ntos(day / 10) + ntos(day % 10);
	switch (month)
	{
	case(1) : sm = "January"; break;
	case(2) : sm = "February"; break;
	case(3) : sm = "March"; break;
	case(4) : sm = "April"; break;
	case(5) : sm = "May"; break;
	case(6) : sm = "June"; break;
	case(7) : sm = "July"; break;
	case(8) : sm = "August"; break;
	case(9) : sm = "September"; break;
	case(10) : sm = "October"; break;
	case(11) : sm = "November"; break;
	case(12) : sm = "December"; break;
	default:break;
	}
	switch (weekday)
	{
	case(1) : sw = "Monday"; break;
	case(2) : sw = "Tuesday"; break;
	case(3) : sw = "Wednesday"; break;
	case(4) : sw = "Thursday"; break;
	case(5) : sw = "Friday"; break;
	case(6) : sw = "Saturday"; break;
	case(7) : sw = "Sunday"; break;
	default:break;
	}
}

void Time::initialTime()//输入初始化时间
{
	cout << "Enter the Time (year,month,day):\n";
	cin >> year;
	cin.get();
	cin >> month;
	cin.get();
	cin >> day;
	cin.get();
	if (!check()){ cout << "Try again:\n"; initialTime(); }
	else
		weekday = Weekdaycount();
}
void Time::Show()const//显示时间信息
{
	cout << "Year: " << year << "\t";
	cout << "Month: " << month << "\t";
	cout << "Day: " << day << "\t";
	cout << "Weekday: " << weekday << endl;
	cout << "This is a ";
	if (isleapyear())cout << "leap"; else cout << "nonleap";
	cout << " year.\n";
	cout << "Today is the " << Daysyearcount() << " days of the year.\n";
}
void Time::StrShow()const//使用字符串的表达显示日期
{
	string st, sy, sm, sd, sw;
	numtostr( sy, sm, sd, sw);
	st = sy + " / " + sm + " / " + sd + " ," + "Today is " + sw + " .";
	string::iterator it = st.begin();
	for (; it != st.end(); ++it)
		cout << *it;
	cout << endl;
	cout << "This is a ";
	if (isleapyear())cout << "leap"; else cout << "nonleap";
	cout << " year.\n";
	cout << "Today is the " << Daysyearcount() << " days of the year.\n";
}
int Time::countdays(const Time & t2)const//计算两个日期间的天数
{
	int t = Daycount() - t2.Daycount();
	if (t < 0) return -t;
	return t;
}

string ntos(int t)//数字转换成字符
{
	switch (t)
	{
	case(0) : return "0";
	case(1) : return "1";
	case(2) : return "2";
	case(3) : return "3";
	case(4) : return "4";
	case(5) : return "5";
	case(6) : return "6";
	case(7) : return "7";
	case(8) : return "8";
	case(9) : return "9";
	default:break;
	}
}
#endif

如需转载,请注明出处。

时间: 2024-08-10 07:35:13

输入一个日期,判断这个日期在一年中是哪一天,是星期几,计算两个日期间的天数,使用字符串输出日期的相关文章

oracle中用SQL实现两个日期间的日期形成一个数据集

比如输入2014-06-1 和 2014-07-1形成一个2014-06-1 2014-06-22014-06-3...2014-07-1 的数据集. 解决方法: select date'2014-06-01'+rownum-1 as my_numbersfrom dualconnect by level <= (date'2014-07-01' - date'2014-06-01') + 1 date 和to_date功能一样 select to_date('2014-06-01','yyyy

获取两个日期间的所有日期

/** ***获取两个日期间的所有日期 ***默认start<end **/ getBetweenDateStr('2017-07-08','2017-07-22'); function getBetweenDateStr(start,end){ var result = []; var beginDay = start.split("-"); var endDay = end.split("-"); var diffDay = new Date(); var

一行代码比较用户A和用户B的年龄大小(列出两个日期间的所有日期)

例1: 一行代码比较用户A和用户B的年龄大小,并列出用户A到用户B生日间的所有日期 <edate id=test list><we start="@{pPage:userABirthday}" end="@{pPage:userBBirthday}" format="yyyy-MM-dd" /></edate> 注意增加了一个list参数 输出计算出的日期列表 <b>用户A到用户B生日间的所有日期&

[Java] 获取两个日期间的所有日期

def GetDates(String startDate, String endDate){  Date d1 = new SimpleDateFormat("yyyyMMdd").parse(startDate);//定义起始日期  Date d2 = new SimpleDateFormat("yyyyMMdd").parse(endDate);//定义结束日期  Calendar dd = Calendar.getInstance();//定义日期实例  d

SQL Server 获取两个日期间的日期

declare @start datetime declare @end datetime set @start = '2018-01-25' set @end = '2018-02-03' select dateadd(dd,num,@start) FROM (SELECT ROW_NUMBER() OVER (ORDER BY ID)-1 AS num FROM sysobjects) KK where dateadd(dd,num,@start) <[email protected] --

实现:判断日期之间关系(相交,相离,重合),得到相交重合的天数以及计算两个日期相差的天数

package com.xiawei.repeatdays; import java.util.Date; /** * 判断日期之间关系(相交,相离,重合),得到相交重合的天数 * */public class RepeatDays { /** * 将两个日期相减的结果以字符串秒的格式返回 */ public static String getDayDifference(Date d1 , Date d2){ StringBuffer ds = new StringBuffer(); long

计算两个日期之间的工作日(去掉周末和节假日)

1 package com.utouu.uphone.commons; 2 3 import java.text.ParseException; 4 import java.text.SimpleDateFormat; 5 import java.util.ArrayList; 6 import java.util.Calendar; 7 import java.util.Date; 8 import java.util.Iterator; 9 import java.util.List; 10

////输入一个100以内的数,判断是不是正整数;

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 练习4 { class Program { static void Main(string[] args) { ////输入一个100以内的数,判断是不是正整数: Console.WriteLine("请输入一个整数"); int a = Convert.ToInt32(Console.ReadL

输入一个日期判断是否正确 javascript

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Typ