用java编写一个万年历

liweida365 2006-09-02 10:15:08
这是一个作业,我是初学者。编写过程中,关于闰年判断还好办,可是判断星期几就难了,我在百度知道上找到一个什么蔡勒公式,完成后每年的1.2.10.11.12都能正常显示,其他都有错误。程序如下,有兴趣和能力的大侠给看看
import javax.swing.*;
class work2
{
public static void main(String args[])
{
int y,m;
String year,month;
year=JOptionPane.showInputDialog( "请输入年份:" );
month=JOptionPane.showInputDialog("请输入月份:");
y = Integer.parseInt( year );
m=Integer.parseInt(month);
int mon[]={29,31,28,31,30,31,30,31,31,30,31,30,31};

if (y%100==0&&y%400==0||y%100!=0&&y%4==0)
{
mon[2]=mon[0];
}
int mm=0;
if(m==1||m==2)
{
y=y-1;
mm=m+12;
}
else mm=m;
int yy,c;
int d=1,x=0,ye,w;
c=(int)(y/100.0);
ye=y;
while(ye>=100)
{
ye=ye-100;
x=ye;
}
w=x+(x/4)+(c/4)-2*c+(26*(mm+1)/10)+d-1;
if(w<=0)
{
w=w*(-1);
}
int xq=w%7;

JTextArea outputArea = new JTextArea();
String output=" sun mon tue wed thu fri sta\n"+xq;
for(int tt=(-1)*xq,ttt=0;tt<= mon[m];tt++,ttt++)
{
if(tt<0)
{
output+=" ";

}
if(tt==0){}
if(tt>=1&tt<10)
{
output+=" "+tt;
if(ttt%7==0)
{
output+="\n";
}

}
if(tt>=10)
{
output+=" "+tt;
if(ttt%7==0)
{
output+="\n";
}

}

}
outputArea.setText(output);
JOptionPane.showMessageDialog( null, outputArea,"万年历",JOptionPane.INFORMATION_MESSAGE );
System.exit(0);




}


}
...全文
1348 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
liweida365 2006-09-06
  • 打赏
  • 举报
回复
十分感谢DrinkT,我的万年历已经好用了,问题就是你说的,如果是负数要加7。
也谢谢其他人,我是初学者,对于大家说的util包的使用,我还学过。今后可能还要问大家,希望各位高人到时不要吝啬。
再次谢谢每位回帖的人!
hyper_net 2006-09-05
  • 打赏
  • 举报
回复
弱弱的问下你们,为什么不用util包中的Calendar呢?
我感觉比那样写算法来的简单。。
brycetoo 2006-09-04
  • 打赏
  • 举报
回复
上星期有一个一样的帖子
laixiaonian88 2006-09-04
  • 打赏
  • 举报
回复
路过

深圳java程序员博客,为你提供多方面资料http://drivemewild.blogchina.com
shi_jz 2006-09-04
  • 打赏
  • 举报
回复
package MonthTest;
import java.util.*;

/**
*打印日历
*/
class MonthDemo{
Calendar today;
int month;
int year;
int weekday;
int day;
MonthDemo(){
today=Calendar.getInstance();
}
void shezhi(int y,int m){
today.clear();
today.set(Calendar.YEAR,y);
today.set(Calendar.MONTH,m);
today.set(Calendar.DAY_OF_MONTH, 1);
month=today.get(Calendar.MONTH)+1;
year=today.get(Calendar.YEAR);
weekday=today.get(Calendar.DAY_OF_WEEK);
}
void xianshi(){
System.out.println("\t\t\t "+year+"年"+month+"月");
System.out.println("\t日\t一\t二\t三\t四\t五\t六");
for(int i=0;i<weekday;i++){
System.out.print("\t");
}
do{
System.out.print(today.get(Calendar.DATE)+"\t");
if(today.get(Calendar.DAY_OF_WEEK)==7)
System.out.print("\n\t");
today.add(Calendar.DAY_OF_MONTH,1);
}while(today.get(Calendar.MONTH)==(month-1));
}
}
public class MonthTest{
public static void main(String args[]){
int y,m;
try{
MonthDemo Md=new MonthDemo();
y=Integer.parseInt(args[0]);
m=Integer.parseInt(args[1]);
Md.shezhi(y,m);
Md.xianshi();
}catch(Exception e){
System.out.println(e.getMessage());
}
}
}
就用util包中的Calendar对象就能实现
rypgood 2006-09-04
  • 打赏
  • 举报
回复
我这里有现成的
yejili 2006-09-04
  • 打赏
  • 举报
回复
元年元月元日就是星期一,不知道Java里有没有函数可以直接计算从某一天到某一天的间隔天数
kyo324 2006-09-04
  • 打赏
  • 举报
回复
楼主要是还不会 我可以帮忙写个代码
kyo324 2006-09-04
  • 打赏
  • 举报
回复
其实楼主只要算公元1年1月1日到今天相差的天数然后再%7
公元1年1月1日是周一好像
DrinkT 2006-09-03
  • 打赏
  • 举报
回复
不知道你算得是哪一年,蔡勒公式,好像只是针对1582年以后的年份有效

好吧,我算了一下,发现结果等于2006.4.1的w是-15,对7求余的话是-1
就是说,是星期日的前一天,那就是星期六了
你直接就绝对值 取正了吧,我也没有想到,居然还符号

这篇文章就是星期几的事情,还有推导过程,不过你只需要用当年第一天是星期几就好了

如何计算某一天是星期几?
http://www.blog.edu.cn/user1/8722/archives/2005/332784.shtml
szz1981 2006-09-03
  • 打赏
  • 举报
回复
学习
liweida365 2006-09-03
  • 打赏
  • 举报
回复
首先谢谢给我提供的程序。我在程序中是用蔡勒公式算每个月的第一天是星期几。其中例如计算2006年4月时,用w=x+[x/4]+[c/4]-2*c+(26*(m+1)/10)+d-1计算。x为6是2006年,c为20是21世纪减去1,m为4是4月,d为1是4月1号。按理说w除以7的余树应该是6,可是我笔算和程序中都得出的是1。我很费解。但是1.2.10.11.12月都没有问题。请问各位高人这是为什么,我哪里错了。谢谢
M3tdw2A7tVe8Xxhd 2006-09-02
  • 打赏
  • 举报
回复
import java.io.*;
class putout{
public void putout(int f,int x,int y){
int i;
int a[]= new int[40];
System.out.println(" 日 一 二 三 四 五 六 "+" "+f+"月");
for (i=0;i<x;i++)
{System.out.print(" "); }
for(i=x;i<x+y;i++)
a[i]=i-x+1;
for(i=x;i<x+y;i++)
{
if ((i%7==0)&&(i>0))
System.out.print("\n");
if (a[i]<10)
System.out.print(" "+a[i]);
else System.out.print(" "+a[i]);
}
System.out.println("\n");
}
}

class st{
public static void main(String args[])throws IOException{
putout p=new putout();
int year,mouth,y=1,t,i;
InputStreamReader ir;
BufferedReader in;
ir=new InputStreamReader(System.in);
in=new BufferedReader(ir);
System.out.print("请输入一个年份:");
String s=in.readLine();
year=Integer.parseInt(s);
if((year%4==0 && year%100!=0)||(year%400==0))
mouth=1;
else
mouth=0;
y=year;
for(i=1;i<year;i++)
{if((i%4==0 && i%100!=0)||(i%400==0))
y++;}
y=y%7;
for(i=1;i<13;i++){
switch(i){
case 1: {p.putout(1,y,31);y=(y+31)%7;break;}
case 2: {p.putout(2,y,28+mouth);y=(y+28+mouth)%7;break;}
case 3: {p.putout(3,y,31);y=(y+31)%7;break;}
case 4: {p.putout(4,y,30);y=(y+30)%7;break;}
case 5: {p.putout(5,y,31);y=(y+31)%7;break;}
case 6: {p.putout(6,y,30);y=(y+30)%7;break;}
case 7: {p.putout(7,y,31);y=(y+31)%7;break;}
case 8: {p.putout(8,y,31);y=(y+31)%7;break;}
case 9: {p.putout(9,y,30);y=(y+30)%7;break;}
case 10: {p.putout(10,y,31);y=(y+31)%7;break;}
case 11: {p.putout(11,y,30);y=(y+30)%7;break;}
case 12: {p.putout(12,y,31);y=(y+31)%7;break;}
}
}
}
}
DrinkT 2006-09-02
  • 打赏
  • 举报
回复
你不用 蔡勒公式 判断每一天的是星期几
你只要算出,需要的打出的年份第一天是星期几就可以了

下边这个是网上的一个例子
提示:公元元年的第一天是星期日
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
这个是个万年历程序

import java.io.*;
class putout{
public void putout(int f,int x,int y){
int i;
int a[]= new int[40];
System.out.println(" 日 一 二 三 四 五 六 "+" "+f+"月");
for (i=0;i<x;i++)
{System.out.print(" "); }
for(i=x;i<x+y;i++)
a[i]=i-x+1;
for(i=x;i<x+y;i++)
{
if ((i%7==0)&&(i>0))
System.out.print("\n");
if (a[i]<10)
System.out.print(" "+a[i]);
else System.out.print(" "+a[i]);
}
System.out.println("\n");
}
}

class st{
public static void main(String args[])throws IOException{
putout p=new putout();
int year,mouth,y=1,t,i;
InputStreamReader ir;
BufferedReader in;
ir=new InputStreamReader(System.in);
in=new BufferedReader(ir);
System.out.print("请输入一个年份:");
String s=in.readLine();
year=Integer.parseInt(s);
if((year%4==0 && year%100!=0)||(year%400==0))
mouth=1;
else
mouth=0;
y=year;
for(i=1;i<year;i++)
{if((i%4==0 && i%100!=0)||(i%400==0))
y++;}
y=y%7;
for(i=1;i<13;i++){
switch(i){
case 1: {p.putout(1,y,31);y=(y+31)%7;break;}
case 2: {p.putout(2,y,28+mouth);y=(y+28+mouth)%7;break;}
case 3: {p.putout(3,y,31);y=(y+31)%7;break;}
case 4: {p.putout(4,y,30);y=(y+30)%7;break;}
case 5: {p.putout(5,y,31);y=(y+31)%7;break;}
case 6: {p.putout(6,y,30);y=(y+30)%7;break;}
case 7: {p.putout(7,y,31);y=(y+31)%7;break;}
case 8: {p.putout(8,y,31);y=(y+31)%7;break;}
case 9: {p.putout(9,y,30);y=(y+30)%7;break;}
case 10: {p.putout(10,y,31);y=(y+31)%7;break;}
case 11: {p.putout(11,y,30);y=(y+30)%7;break;}
case 12: {p.putout(12,y,31);y=(y+31)%7;break;}
}
}
}
}
java编写万年历程序 package Day; import java.util.Scanner; public class Day { static int B1=0; //判断是否为闰年,1代表闰年,0代表平年 static int B2; //判断月份的天数,0代表31天,1代表29天,2代表28天,3代表30天 static int DAY1=0; //计算从1900年到今年1月1日的天数 static int DAY2=0; //计算从今年1月1日到本月1日的天数 static int Month_Day=0; //计算本月的天数 static int Y=1900; //代表起始年,1900年 public static void main(String agrs[]){ System.out.println("请输入年份:"); Scanner sc=new Scanner(System.in); int year = sc.nextInt(); System.out.println("请输入月份:"); int month = sc.nextInt(); //计算从1900年到本年1月1日的天数 for(int i=0;i<=year-1900;i++){ year(Y); if(B1==1&&i!=year-1900){ //如果闰年则一年366天 DAY1=DAY1+366; } else if(B1==0&&i!=year-1900){ //如果是平年,则一年有365天 DAY1=DAY1+365; } Y++; } //计算从本年1月1日到本月1日的天数 for(int j=1;j<=month-1;j++){ //j表示从本年一月份一直到上月,month表示本月 month(j); //month(),表示判断月份性质的方法函数 if(B2==0){ //B2==0,表示本月为31天(1,3,5,7,8,10,12月) DAY2=DAY2+31; } else if(B2==1){ //B2==1,表示本月为闰年的2月,有29天 DAY2=DAY2+29; } else if(B2==2){ //B2==2,表示本月为平年的2月,有28天 DAY2=DAY2+28; } else if(B2==3){ //B2==3,表示本月为其他月份30天(4,6,9,11月) DAY2=DAY2+30; } } month(month); //判断本月共多少天 { if(B2==0){ Month_Day=31; } else if(B2==1){ Month_Day=29; } else if(B2==2){ Month_Day=28; } else if(B2==3){ Month_Day=30; } } // System.out.println(DAY1); // System.out.println("本年已过"+DAY2+"天"); int Today=(DAY1+DAY2)%7+1; //判断本月的第一天是星期几 // System.out.println(Today); // System.out.println(Month_Day); // System.out.println("B1="+B1+" "+"B2="+B2); int num=1; //num表示本月的日期,如:1日,2日,3日。。。。。 System.out.print("一\t"+"二\t"+"三\t"+"四\t"+"五\t"+"六\t"+"七\n"); for(int k=1;num<=Month_Day;k++){ //k代表统计显示日历矩阵的日期的个数,当num小于本月的天数,将继续显示num if(k=Today){ //当k等于Today即刻开始显示日期,从num==1开始显示 System.out.print(num+"\t"); num++; if(k%7==0){ System.out.println(""); //当k是7的整数倍的时候需要换行 } } } } public static int year( int year){ if((year%4==0&&year0;!=0)||(year@0==0)){ //System.out.println("这是闰年!"); return B1=1; } else{ //System.out.println("这不是闰年!"); return B1=0; } } public static int month( int month){ if(month==1||month==3||month==5||month==7||month==8||month==10||month==12){ //System.out.println("这个月有31天!"); return B2=0; } else if(month==2&&B1;==1){ //System.out.println("这个月有30天或者28天,或者29天!"); return B2=1; } else if(month==2&&B1;==0){ return B2=2; } else{ return B2=3; } } }
课程内容:本课程是《Java工程师必学系列课程》的第6部分,主要讲解Java语言中中新旧两代日期时间相关的类、日期时间相关的处理方法、历法和时间计算的常识,在课程的最后还安排了万年历实战项目本课程涉及的主要内容可以分为四部分:一、Java语言旧日期时间系统二、Java8新日期时间系统三、日期、时间、历法基础知识四、万年历项目课程说明:在开发Java程序的过程中,无论做什么类型的项目,基本上都会处理与日期和时间相关的问题。既然日期时间问题的处理已经成了程序必须要掌握的技能,那我们就必须认真深入的学习日期时间的计算和处理方法。本课程将深入讲解Java语言新旧两代日期时间系统的相关知识。在讲解的过程中,不仅仅讲解如何调用各种类所提供的方法去处理相关问题,更是从原理上深入分析了这些类的设计原理,以及要如何避免在实战中踩到那些非常隐蔽的大坑。此外,除了讲解日期时间相关工具类的使用,本课程还向广大学员普及了一些必要的日期、时间和历法的相关知识。让学员能够从根本上理解日期时间算法的设计思路。同时,本课程在最后一部分,安排了非常精彩的、完整的万年历项目,通过实战的形式切实帮助学员提高解决具体问题的能力!预期效果:认真学习完本课程,学员可以掌握日期时间计算和处理的相关知识,并能提高实际的编码水平。配套福利:万年历软件的完整源码环境配置要求:学习本课程需安装JDK13或更高版本的JDK,以便程序能正确运行,建议使用IntelliJ IDEA 2019.1.2或更高版本的开发工具。因有合作协议约束,《穆哥学堂》只提供PDF版本的课件!

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧