java代码万年历带日_用java代码写万年历

大家好,今天给大家分享万年历的编写。可能有人觉得这很难,假如输入不同的年和月,那么显示的月份天数不一样,然后还有平年闰年判断,又要算出不同年月前面的空格是多少,也要算出与日期对应的星期。前面这些问题看似有点复杂,但是如果把问题细分一下,逐个解决,然后再整合修改,万年历不就可以完成了吗?在这里我使用的是递归方法。我们一起来实现代码吧!

万年历是从1900年开始,有平年,闰年判断。

/**

\* 平闰年的判断

\* @param year 年

\* @return 返回年

*/

public static boolean isLeapYear(int year) {

//闰年就是能够被4整除并且不能被100整除或者能被400整除的数

return year % 4 == 0 && year % 100 != 0 || year % 400 == 0;

}

之后就算最小年份和最大年份

/**

*

* @param maxYear

* 最大年份

* @param minYear最小年份

* @return

*/

public static int yearDate(int maxYear, int minYear) {

int sum = 0;

for (int i = minYear; i < maxYear; i++) {

if (isLeapYear(i)) {//如果是闰年就加366天

sum += 366;

} else {//如果不是是闰年就加365天

sum += 365;

}

}

return sum;

}

/**

* 获取今天是今年的的第几天

*

* @param year 参数 年

* @param month 参数 月

* @param date 参数 日

* @return

*/

public static int yearMonthDay(int year, int month, int date) {

int sum = 0;

for (int i = 1; i < month; i++) {

if (i == 2) {

if (isLeapYear(year)) {//如果是闰年就加29天,否则加28天

sum += 29;

} else {

sum += 28;

}

} else if (i == 1 || i == 3 || i == 5 || i == 7 || i == 8 || i == 10 || i == 12) {

sum += 31;

} else {

sum += 30;

}

}

sum += date;

return sum;

}

/**

* 1900年1月1号是星期一 ,计算出某年某日是星期几时

*

* @param year 参数 年

* @param month 参数 月

* @param date 参数 日

* @return

*/

public static int getWeek(int year, int month, int date) {

int sum = 0;

//调用获取今天是今年的的第几天方法

sum += yearMonthDay(year, month, date);

sum += yearDate(year, 1900);

//因为多加了1号,要自减

sum--;

int week=sum%7+1;

return week;

}

计算空格问题和换行问题

/**

* 定义空格数和换行规则

* @param e

* @param d

*/

public static void printDay1(int e,int d){

for(int i=0;i

System.out.print("\t");

}

for(int i=1;i<=d;i++){

System.out.print(i+"\t");

if((i+e)%7==0){

System.out.println();

}

}

}

写在到这一步,下面就写一个关于万年历的方法

/**

* 万年历

*/

public static void wannianli(int y,int m){

System.out.println("一\t二\t三\t四\t五\t六\t日");

int e=0;

int max=31;

if(m==2){

if(isLeapYear(y)){

max=29;

}else{

max=28;

}

}else if(m == 4 || m == 6 || m == 9 || m == 11 ){

max=30;

}

int week=getWeek(y, m, 1);

//因为星期是0-6,为了更好的规范效果所以-1

e=week-1;

printDay1(e,max);

}

最后把这这万年历方法放在主函数里面,输入一个年份月份在控制台输出就能得到结果

public static void main(String[] args) {

wannianli(2020,5);

}

结果为下图:

f7d7f46a47a09034832fdb766c632e61.png

完整代码是:

public class Work1 {

public static void main(String[] args) {

wannianli(2020,5);

}

/**

* 万年历

*/

public static void wannianli(int y,int m){

System.out.println("一\t二\t三\t四\t五\t六\t日");

int e=0;

int max=31;

if(m==2){

if(isLeapYear(y)){

max=29;

}else{

max=28;

}

}else if(m == 4 || m == 6 || m == 9 || m == 11 ){

max=30;

}

int week=getWeek(y, m, 1);

e=week-1;

printDay1(e,max);

}

/**

* 定义空格数和换行规则

* @param e

* @param d

*/

public static void printDay1(int e,int d){

for(int i=0;i

System.out.print("\t");

}

for(int i=1;i<=d;i++){

System.out.print(i+"\t");

if((i+e)%7==0){

System.out.println();

}

}

}

/**

* 平闰年的判断

* @param year

* @return

*/

public static boolean isLeapYear(int year) {

return year % 4 == 0 && year % 100 != 0 || year % 400 == 0;

}

/**

*

* @param maxYear

* 最大年份

* @param minYear最小年份

* @return

*/

public static int yearDate(int maxYear, int minYear) {

int sum = 0;

for (int i = minYear; i < maxYear; i++) {

if (isLeapYear(i)) {

sum += 366;

} else {

sum += 365;

}

}

return sum;

}

/**

* 获取今天是今年的的第几天

*

* @param year

* @param month

* @param date

* @return

*/

public static int yearMonthDay(int year, int month, int date) {

int sum = 0;

for (int i = 1; i < month; i++) {

if (i == 2) {

if (isLeapYear(year)) {

sum += 29;

} else {

sum += 28;

}

} else if (i == 1 || i == 3 || i == 5 || i == 7 || i == 8 || i == 10 || i == 12) {

sum += 31;

} else {

sum += 30;

}

}

sum += date;

return sum;

}

/**

* 1900年1月1号是星期一 ,计算出某年某日是星期几时

*

* @param year

* @param month

* @param date

* @return

*/

public static int getWeek(int year, int month, int date) {

int sum = 0;

sum += yearMonthDay(year, month, date);

sum += yearDate(year, 1900);

sum--;

int week=sum%7+1;

return week;

}

}

以上就是本期的内容,谢谢你的观看!

java 万年历代码 片段如下: package wannianli; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; //import java.sql.Date; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import javax.swing.Icon; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.table.DefaultTableModel; public class wannianli extends JFrame implements ActionListener, MouseListener { private Calendar cld = Calendar.getInstance(); private String [] astr = {"星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"}; private DefaultTableModel dtm = new DefaultTableModel(null,astr); private JTable table = new JTable(dtm); //装日期的表格 private JScrollPane sp = new JScrollPane(table); private JButton bLastYear = new JButton("上一年"); private JButton bNextYear = new JButton("下一年"); private JButton bLastMonth = new JButton("上月"); private JButton bNextMonth = new JButton("下月"); private JTextField jtfYear = new JTextField(5);//jtfYear年份显示和输入文本框,允许编辑单行文本 private JTextField jtfMonth = new JTextField(2);//jtfMonth月份显示文本框 private JPanel p1 = new JPanel(); //装入控制日期按钮的模块 private JPanel p2 = new JPanel(); private JPanel p3 = new JPanel(new BorderLayout()); private JPanel p4 = new JPanel(new GridLayout(2,1)); private JPanel p5 = new JPanel(new BorderLayout()); private JButton bAdd = new JButton("保存日志"); private JButton bDel = new JButton("删除日志"); private JTextArea jta = new JTextArea(); //JTextArea 是一个显示纯文本的多行区域 private JScrollPane jsp = new JScrollPane(jta); //管理视口、可选的垂直和水平滚动条以及可选的行和列标题视口 private JLabel l = new JLabel("小提示:可直接输入年份,提高查询效率!"); private JLabel lt = new JLabel();//系统时间 private JLabel ld = new JLabel();//日期是否被选择 private int lastTime; JMenuBar jmb = new JMenuBar(); JMenu view;
java 万年历程序代码 package test2; import java.util.Scanner; public class Test2{ public static void main(String[] args) { Scanner input=new Scanner(System.in); System.out.print("请输入年份:"); int year=input.nextInt(); System.out.print("\n请输入月份:"); int month=input.nextInt(); System.out.println(); int totalDays=0; if(year>=1900) { for(int i=1900;i<year;i++) { if((i%4==0 && i0!=0)||(i%400==0)) totalDays+=366; else totalDays+=365; } int daysOfMonth=0; int days; for(int i=1;i<month;i++) { switch(i) { case 2: if((year%4==0 && year0!=0)|| year%400==0) days=29; else days=28; break; case 4: case 6: case 9: case 11: days=30; break; default: days=31; } daysOfMonth+=days; } switch(month) { case 2: if((year%4==0 && year0!=0)|| year%400==0) days=29; else days=28; break; case 4: case 6: case 9: case 11: days=30; break; default: days=31; } totalDays+=daysOfMonth; int firstDay=(totalDays)%7+1; if(firstDay==7)firstDay=0; System.out.println("星期日\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六");//显示月历 for(int i=0;i<firstDay;i++) System.out.print("\t"); for(int i=1;i<=days;i++) { System.out.print(i+"\t"); if((i-1)%7+firstDay==6) System.out.println(); } } else if(year>0&&year<1900) { for(int i=1899;i>year;i--) { if((i%4==0 && i0!=0)||(i%400==0)) totalDays+=366; else totalDays+=365; } int daysOfMonth=0; int days; for(int i=12;i>=month;i--) { switch(i) { case 2: if((year%4==0 && year0!=0)|| year%400==0) days=29; else days=28; break; case 4: case 6: case 9: case 11: days=30; break; default: days=31; } daysOfMonth+=days; } switch(month) { case 2: if((year%4==0 && year0!=0)|| year%400==0) days=29; else days=28; break; case 4: case 6: case 9: case 11: days=30; break; default: days=31; } totalDays+=daysOfMonth; int firstDay=8-(totalDays)%7; if(firstDay==7)firstDay=0; if(firstDay==8)firstDay=1; System.out.println("星期日\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六"); for(int i=0;i<firstDay;i++) System.out.print("\t"); for(int i=1;i<=days;i++) { System.out.print(i+"\t"); if((i-1)%7+firstDay==6) System.out.println(); } } System.out.println("\n程序结束"); } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值