
import java.util.*
public class Test36 {
public static void main(String[] args) {
try {
SimpleDateFormat farmatter = new SimpleDateFormat("yyyy-MM-dd")
Date d1, d2
int year, month
String temp
Scanner scan = new Scanner(System.in)
System.out.print("请输入一个年月值\n年衫携份:")
year = scan.nextInt()
System.out.print("月份:")
month = scan.nextInt()
MyCalendar.listCalendar(year, month)
System.out.print("请输入一个日期(yyyy-MM-dd):")
temp = scan.next()
d1 = farmatter.parse(temp)
System.out.println(d1.toLocaleString() + " 是 " + MyCalendar.getDayOfWeek(d1))
System.out.print("请输入两个日期(yyyy-MM-dd)\n")
System.out.print("日期1 : ")
temp = scan.next()
d1 = farmatter.parse(temp)
System.out.print("日期2 : ")
temp = scan.next()
d2 = farmatter.parse(temp)
int diff = MyCalendar.dateDiff(d1, d2)
System.out.printf("%s 和 %s 之间相隔 %d 天\n", d1.toLocaleString(), d2.toLocaleString(), diff)
}
catch (Exception e) {
e.printStackTrace()
}
}
}
class MyCalendar{
//1) 用户输入一个年份和月份或做伏,程序输出这个月的月历,每星期一行,星期天开始,星期六结束。
public static void listCalendar(int year, int month){
if(month<1 || month>12){
System.out.println(month + " 是非法的月份值,它的有效范围是 1~12")
return
}
System.out.println(" " + year + " - " + month)
System.out.println(" ---------------------------")
System.out.printf("%4s%4s%4s%4s%4s%4s%4s\n", "Sun", "Mon", "Tue", "Wed", "胡毕Thu", "Fri", "Sat")
try{
Calendar c = Calendar.getInstance()
c.set(year, month-1, 1)
int num = getDays(year, month) //本月天数
int i
for(i=0i<(c.get(Calendar.DAY_OF_WEEK) - 1) * 4i++){
System.out.print(" ")
}
for(i=0i<numi++){
c.set(year, month-1, i+1)
System.out.printf("%4s", i+1)
if(c.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY){
System.out.println()
}
}
System.out.println()
}
catch(Exception e){
e.printStackTrace()
}
}
//2) 用户输入一个日期,程序显示这个日期当天是星期几。
public static String getDayOfWeek(Date d){
String[] weeks = new String[]{"星期天","星期一","星期二","星期三","星期四","星期五","星期六"}
Calendar c = Calendar.getInstance()
c.setTime(d)
return weeks[c.get(Calendar.DAY_OF_WEEK)-1]
}
//3) 用户输入两个日期,程序计算这两个日期相差的天数。
public static int dateDiff(Date d1, Date d2) throws Exception {
int i
int[] days = new int[]{31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
Calendar c1, c2
int y1, y2
int diff0 = 0, diff1 = 0, diff2 = 0
c1 = Calendar.getInstance()
c1.setTime(d1)
y1 = c1.get(Calendar.YEAR)
c2 = Calendar.getInstance()
c2.setTime(d2)
y2 = c2.get(Calendar.YEAR)
//计算d1日期到d1所在年份第一天相隔的天数
days[1] = isLeapYear(y1) ? 29 : 28
for(i=1i<=c1.get(Calendar.MONTH)i++){
diff1 += days[i-1]
}
//计算d2日期到d2所在年份第一天相隔的天数
days[1] = isLeapYear(y2) ? 29 : 28
for(i=1i<=c2.get(Calendar.MONTH)i++){
diff2 += days[i-1]
}
//计算d1、d2两个日期的年份相隔的天数
if(y1 <y2){
for(i=y1i<y2i++){
diff0 += isLeapYear(i) ? 366 : 365
}
}
else if(y1 >y2){
for(i=y2i<y1i++){
diff0 += isLeapYear(i) ? 366 : 365
}
diff0 *= -1
}
return diff0 + diff2 - diff1 + c2.get(Calendar.DATE) - c1.get(Calendar.DATE)
}
//判断一个年份是否是闰年
public static boolean isLeapYear(int year){
return ((year%400==0) || (year%4==0 &&year%100!=0)) ? true : false
}
//返回某月的天数
public static int getDays(int year, int month){
if(month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12){
return 31
}
else if(month == 4 || month == 6 || month == 9 || month == 11){
return 30
}
else{
if(isLeapYear(year) == true){
return 29
}
else{
return 28
}
}
}
}
运行测试:
请输入一个年月值
年份:2011
月份:6
2011 - 6
---------------------------
Sun Mon Tue Wed Thu Fri Sat
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
请输入一个日期(yyyy-MM-dd):2011-6-15
2011-6-15 0:00:00 是 星期三
请输入两个日期(yyyy-MM-dd)
日期1 : 2009-3-10
日期2 : 2011-6-15
2009-3-10 0:00:00 和 2011-6-15 0:00:00 之间相隔 827 天
CalendarBuilder
V3.45┊日历制作软件、内建日历模式样板帆蚂厅┊英文绿色特别版
软件介绍:非常棒的日历制作软件,程物悔序内建多种的日历模式样板,如每月、每年、每周等等,它支持中文字形,可加入文字及喜欢的图片,更可将每个节日放上喜欢的ICON来表示,相当不错,设计完并可将它打出来使用。
下载地态隐址:http://www.greendown.cn/soft/4381.html
#include <windows.h>棚芹#include <winnt.h>
#include<iostream>
#include<iomanip>
using namespace std
int week(int,int,int) //根据年月日判断星期几
int leap_year(int)//判断闰年
void display_year(int ) //显示某年岁粗日历
void demand_day(int,int,int) //查询某天
int main()
{
int y,m,d,es=1
while(es)
{
HANDLE consolehwnd
consolehwnd = GetStdHandle(STD_OUTPUT_HANDLE)
SetConsoleTextAttribute(consolehwnd,12)
cout<<"请选择 *** 作:\n1→显示某年日历\
\n2→查询某天\n0→退出"<<endl
char tp[20]cin>>tp
if(tp[1]!='\0'||tp[0]>'2'||tp[0]<'0'){cout<<链雀毕"输入有误"<<endlcontinue}
switch(tp[0]-48)
{
case 1:{cout<<"请输入年份:"cin>>ysystem("cls")display_year(y)break}
case 2:{cout<<"请输入年、月、日,以空格分开:"cin>>y>>m>>dsystem("cls")
demand_day(y,m,d)break}
case 0:{es=0break}
}
}
return 0
}
//-----根据年月日判断星期几-------------------------
int week(int y,int m, int d)
{
int week1,yy=y
if(m==1) {m=13yy--}
if(m==2) {m=14yy--}
week1=(d+2*m+3*(m+1)/5+yy+yy/4-yy/100+yy/400)%7
int s
switch (week1)
{
case 0: s=1break
case 1: s=2break
case 2: s=3break
case 3: s=4break
case 4: s=5break
case 5: s=6break
case 6: s=0break
}
return s
}
//----判断闰年-------------------------------------
int leap_year(int y)
{
int i
if((y%4==0&&y%100!=0)||y%400==0)i=1
else i=0
return i
}
//--------显示某年日历------------------------
void display_year(int y)
{
int n1,n2,i,j,a[13],c,d
HANDLE consolehwnd
consolehwnd = GetStdHandle(STD_OUTPUT_HANDLE)
SetConsoleTextAttribute(consolehwnd,5)
cout<<setw(38)<<y<<"年"<<endl
cout<<setw(28)<<"*********"
for(i=1i<=27i++)cout<<'*'
cout<<endl
a[1]=a[3]=a[5]=a[7]=a[8]=a[10]=a[12]=31//
a[4]=a[6]=a[9]=a[11]=30 //确定每月天数
if(leap_year(y))a[2]=29
else a[2]=28 //
for(i=1i<=11i+=2) //六次循环
{
SetConsoleTextAttribute(consolehwnd,1)
cout<<setw(14)<<i<<"月"<<setw(42)<<i+1<<"月"<<endl
SetConsoleTextAttribute(consolehwnd,2)
cout<<setw(4)<<"日"<<setw(4)<<"一"<<setw(4)<<"二"<<setw(4)<<"三"<<setw(4)\
<<"四"<<setw(4)<<"五"<<setw(4)<<"六"
cout<<setw(16)<<' '
cout<<setw(4)<<"日"<<setw(4)<<"一"<<setw(4)<<"二"<<setw(4)<<"三"<<setw(4)\
<<"四"<<setw(4)<<"五"<<setw(4)<<"六"<<endl
SetConsoleTextAttribute(consolehwnd,7)
n1=week(y,i,1)n2=week(y,i+1,1)
if(n1)//-----------
{
for(j=1j<=n1j++)//
cout<<setw(4)<<' '
}
for(j=1j<=7-n1j++)
cout<<setw(4)<<j
cout<<setw(16)<<' '
if(n2)
{//-----输出每次循环的第一行---
for(j=1j<=n2j++)
cout<<setw(4)<<' '
}
for(j=1j<=7-n2j++)
cout<<setw(4)<<j
cout<<endl //--------------
c=8-n1d=8-n2
for(int m=1m<6m++) //每月日历最多占六行
{
if(c>a[i])cout<<setw(4*7)<<' '//若c>a[i],则该月的这一行全部输出空格
for(j=cj<=a[i]j++)
{
cout<<setw(4)<<j
if((j-c+1)%7==0){c=j+1break}
if(j==a[i]){cout<<setw((6-week(y,i,a[i]))*4)<<' 'c=j+1break}
//如果j是该月最后一天,该行剩下的全部补空格
}
cout<<setw(16)<<' '
if(d>a[i+1])cout<<setw(4*7)<<' '
for(j=dj<=a[i+1]j++)
{ //
cout<<setw(4)<<j
if((j-d+1)%7==0){d=j+1break}
if(j==a[i+1]){cout<<setw((6-week(y,i+6,a[i+1]))*4)<<' 'd=j+1break}
}
cout<<endl
}
cout<<endl
}
cout<<endl
}
//--------查询某天------------
void demand_day(int y,int m,int d)
{
int n
HANDLE consolehwnd
consolehwnd = GetStdHandle(STD_OUTPUT_HANDLE)
SetConsoleTextAttribute(consolehwnd,5)
n=week(y,m,d)
switch(n)
{
case 1:cout<<y<<"年"<<m<<"月"<<d<<"日"<<","<<"星期一"<<endlbreak
case 2:cout<<y<<"年"<<m<<"月"<<d<<"日"<<","<<"星期二"<<endlbreak
case 3:cout<<y<<"年"<<m<<"月"<<d<<"日"<<","<<"星期三"<<endlbreak
case 4:cout<<y<<"年"<<m<<"月"<<d<<"日"<<","<<"星期四"<<endlbreak
case 5:cout<<y<<"年"<<m<<"月"<<d<<"日"<<","<<"星期五"<<endlbreak
case 6:cout<<y<<"年"<<m<<"月"<<d<<"日"<<","<<"星期六"<<endlbreak
case 0:cout<<y<<"年"<<m<<"月"<<d<<"日"<<","<<"星期日"<<endlbreak
default:break
}
cout<<endl
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)