JAVA设计实现日历计算程序

JAVA设计实现日历计算程序,第1张

import java.text.*

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 天

Calendar

Builder

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

}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/8216242.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-14
下一篇2023-04-14

发表评论

登录后才能评论

评论列表(0条)

    保存