一, Java 实现万年历的代码 :
calendrier des colis; import java.util.scanner; // 日历项目 public class rili {public static void main (string [] args) {scanner a = new scanner (System.in); System.out.println ("请输入年份 :"); int an = a.Nextint (); System.out.println ("请输入月份 :"); int mois = a.Nextint (); int sum = 0; pour (int i = 1900; i <an; i ++) {if (i% 4 == 0 && i% 100! = 0 || i% 400 == 0) {sum = sum + 366; } else {sum = sum + 365; }} pour (int i = 1; i <mois; i ++) {if (i == 2) {if (année% 4 == 0 && an% 100! = 0 || an% 400 == 0) {sum = sum + 29;} else {sum = sum + 28; }} else {if (i == 4 || i == 6 || i == 9 || i == 11) {sum + = 30; } else {sum + = 31; }}} sum = sum + 1; int wekday = somme% 7; System.out.println ("日 / t 一 / t 二 / t 三 / t 四 / t 五 / t 六"); for (int i = 1; i <= wekday; i ++) {System.out.print ("/ t"); } int f = 0; if (mois == 4 || mois == 6 || mois == 9 || mois == 11) {f = 30;} if (mois == 1 || mois == 3 || mois == 5 || mois == 7 || mois == 8 || mois == 10 || mois == 12) {f = 31;} if (mois == 2) { if (année% 4 == 0 && année% 100! = 0 || an% 400 == 0) {f = 29;} else {f = 28;}} pour (int i = 1; i <= f; i ++) {if (sum% 7 == 6) {System.out.print (i + "/ n"); } else {System.out.print (i + "/ t"); } sum ++; }}}
二. 一个 java 万年历 , 比较简单的那种 , 显示年月日、星期几、当前日期是第几周、显示闰年、打印万年历等 , 还可显示当前日期是一年中的第几天 , 指定日期是星期几等 , 采用了基姆拉尔森计算公式 , w = (d + 2 * m + 3 * (m + 1) / 5 + y + y / 4-y / 100 + y / 400) mod 7 , 在公式中 d 表示日期中的日数 , , 表示月份数 , , 表示年数。注意 :: 在公式中有个与其他公式不同的地方 来代入公式计算。-10
classe publique myCalendar {// 以下程序段是用来计算输入日期为该年的第几天的 public static int Cptday (int an, int mois, int day) {byte dayAdd [] = {1, -2,1,0,1,0,1,1,0,1,0,1}; // 用来存储每个月天数和 30 的差值 int dayCount = 0; // 这是天数 DayCount 计数器 , 初始化为 0 pour (int i = 0; i <mois-1; i ++) dayCount + = (30 + dayAdd [i]); DayCount + = jour; retour (mois> 2)? DayCount + Isleap (année): DayCount; } // 闰年判定程序段 , 闰年返回 1 , 平年返回 0 public static int isleap (int an) {if ((année% 400 == 0) || ((année% 4 == 0) && (année% 100! = 0))) Retour 1; retour 0; } // 计算输入日期是星期几 // 采用了基姆拉尔森计算公式 // w = (d + 2 * m + 3 * (m + 1) / 5 + y + y / 4-y / 100 + y / 400) mod 7 // 在公式中 d 表示日期中的日数 , m 表示月份数 , y 表示年数。 // 注意 : : 在公式中有个与其他公式不同的地方 :-13-10 来代入公式计算。 例 例: 如果是 如果是 2004-1-10 则换算成 : 2003-13-10 来代入公式计算。 Public Static Intreek (int, int, 2003-13-10 œuvre day) {if (mois <3) {mois + = 12; année--;} retour (jour + 2 * mois + 3 * (mois + 1) / 5 + an + an / 4 ans / 100 + an / 400)% 7; } // 以下程序段是来计算输入日期为该年第几周的 public static int WeekCount (int an, int mois, int day) {int daycnt = cptday (année, mois, jour); int Weekminus = getweek (année, mois, jour) -getweek (année, 1,1); int semainecnt = 0; if (daycnt% 7 == 0) weekcnt = daycnt / 7 + ((Weekminus> 0)? 1: 0); else weekcnt = daycnt / 7 + ((Weekminus> 0)? 2: 1); Retour WeekCnt; } // 打印万年历 public static void printcal (int an) {byte dayAdd [] = {0,1, -2,1,0,1,0,1,1,0,1,0,1}; // 同样的 , 每月天数和 30 的差值 , 注意 , dadadd [0] 的 0 并没用到 int wkpoint = getweek (année, 1,1); // wkpoint 用来指出当前日期的星期数 int t = 0; // t 用来作为一个标记器 , 解决闰年 2月有 29 天的问题 int bk = 0; // BK 用来记录需输空白的数目 String Week [] = {"星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"}; pour (int i = 1; i <13; i ++) {t = 0; bk = 0; if ((i == 2) && (isleap (année) == 1)) t = 1; // 当且仅当闰年的 2月份才将其置为 1 System.out.println ("/ n / n / t / t" + année + "年" + i + "月 / n"); pour (int j = 0; j <7; j ++) System.out.print (semaine [j] + "/ t"); System.out.println (); while (bk ++ <wkpoint) System.out.print ('/ t'); pour (int j = 1; j <= (30 + dayAdd [i] + t); j ++) {System.out.print (j + "/ t"); // 循环输出每月日期 if (wkpoint == 6) {wkpoint = 0; System.out.print ('/ n');} // 当 wkpoint 计数器为 6 时将其置为 0 , 并换行 else wkpoint ++; }}} public static void main (String [] args) {String Week [] = {"星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"}; System.out.println ("输入的日期是该年的第" + cptday (2009,2,15) + "天"); System.out.println ("这一天是该年的第" + Weekcount (2009,2,15) + "周" + semaine [Getweek (2009,2,15)]); Printcal (2009); }}三、
1. 用户输入信息 -> 进行信息判断 (是否符合要求)
2. 以 1900 年 1月 1 日 (星期一) 为基准 , 计算 1900 年 1月 1日至当日的总天数
(1) 先计算 1900 年至 (用户输入的年 - 1) 的总天数 -> 注意平闰年之分
(2) 计算用户输入年份的 1月至 (用户输入月份 - 1) 的天数
3. 计算输入月份的第一天是星期几
4. 格式化输出
以下我们按照步骤一步一步进行代码解析
一) 、利用 do-while 循环接受用户输入信息 , 并利用 if-else 语句进行判断
INT annuelle; int mois int; booléen xn = false; do {System.out.println ("请输入年份:"); année = input.nextint (); System.out.println ("请输入月份:"); mois = input.nextint (); // 利用 booléen 类型的表达式进行输入信息的判断 xn = (mois <1) || (mois> 12) || (année <1); if (xn) {System.out.println ("输入信息错误 , 请重新输入!"); }} while (xn);二) 、判断平闰年 , 并计算 1900 年至 (用户输入年 - 1) 的总天数
int everyyearday = 0; // 每年的天数 int totalaSDays = 0; // 计算年的天数 int entréeyearday = 0 // 记录用户输入年的天数 boolean yn = false; // 标识平闰年 // 利用 pour 循环计算天数 pour (int i = 1900; i <= an; i ++) {if ((i% 4 == 0) && (i% 100! = 0)) || (i% 400 == 0)) // 闰年的判断条件 {yn = true; tous les jours = 366; } else {yn = false; tous les jours = 365; } // 如果循环中的年份小于用户输入的年份, 则累积天数 if (i <an) {TotalyeARSDays = TotalyEarsdays + Everyyearday; } else {inputyearday = everyyearday; System.out.println (année + "年 共 有:" + Inputyearday + "天"); }}三) 、判断月份的天数 , 并计算当年 1月至 (用户输入月份 -1) 的天数
int Everymonthday = 0; // 记录每月的天数 int totalmonthsdays = 0; // 总天数 int inputmonthday = 0; // 记录用户输入的月份在用户输入年份的天数 // 利用 pour 循环计算天数 pour (int i = 1; i <= mois; i ++) {switch (i) {cas 4: cas 6: cas 9: cas 11: EveryMonthday = 30; casser; Cas 2: if (xn) // xn 是用来记录平闰年的 booléen 类型的变量 {EveryMonthday = 29; } else {EveryMonthday = 28; } casser; par défaut: Everymonthday = 31; casser; } if (i <mois) {totalmonthsdays = totalmonthsdays + everymonthday; } else {inputmonthday = everymonthday; System.out.println (mois + "月 共 有:" + Inputmonthday + "天"); }}四) 、计算总天数 , 并计算出用户输入的月份的第一天星期几
int total = Total Monthsdays + Totalyearsdays; // 计算总天数
int temp = (total + 1)% 7; // 判断输入月份的第一天星期几
五) 、格式化输出
// 因为我们的输入格式是 // 星期日 星期一 星期二 星期三 星期四 星期五 星期六 // 当星期日时的时候 , 我们直接输出就好了 , 但是当 // 第一天是星期一的时候 , 我们就必须首先打印出空格 // 然后再输出日期 , 才能让号码和星期想对应 // 打印空格 pour (int spaceno = 0; spaceno <temp; spaceno ++) {system.out.print ("/ t"); } // 按照顺序打印号码 pour (int i = 1; i <= inputmonthday; i ++) {if ((total + i)% 7) // 判断是否该换行了 {System.out.println (i); } else {System.out.print (i + "/ t"); }}四、 java (用 calendrier 类) 写一个万年历, 输入年并且显示当年的日历
classe publique MyCalendar {public static void main (String args []) {scanner sc = new Scanner (System.in); Calendrier c = calendar.getInstance (); System.out.println ("请输入数字年 : (比如 2014)"); int an = sc.nextint (); sc.close (); // int an = 2014; C.Set (calendrier.year, année); pour (int i = 0; i <12; i ++) {c.set (calendar.month, i); // c.set (calendar.date, 1); // 设置成 1月 printmonth (c); }} public static void printmonth (calendar c) {c.set (calendar.day_of_month, 1); // 设置成一日 System.out.printf ("/ n / n ========% s 月 ======== / n", c.get (calendar.month) +1); String [] semaines = {"日", "一", "二", "三", "四", "五", "六"}; for (int i = 0; i <weeks.length; i ++) {System.out.printf ("% s" + (i! = 6? "/ t": "/ n"), semaines [i]); } int offday = c.get (calendar.day_of_week) - 1; for (int i = 0; i <offday; i ++) {System.out.printf ("/ t"); } int mois = c.get (calendar.month); while (c.get (calendar.month) == mois) {System.out.printf ("% d" + ((c.get (calendar.day_of_week))! = 7? "/ t": "/ n"), c.get (calendar.day_of_month)); c.add (calendar.day_of_month, 1); }}}五、程序 : 万年历 + 时钟小程序实现
Java 知识点有 : Java 常用内库与工具 (Date 类、 Calendrier 类等) 、异常 (Essayez ..... Catch) 、线程、 awt 图形用户界面等基础知识点。
import javax.swing. *; import java.awt. *; import java.awt.event. *; import java.text. *; import java.util. *; // 创建窗口和年历 Classe MainFrame étend JFrame {jpanel Panel = new JPanel (new BorderLayout ()); // BorderLayout 为边界布局 Jpanel Panel1 = new JPanel (); Jpanel Panel2 = New Jpanel (New GridLayout (7,7)); // GridLayout 为网格布局 JPANEL PANNEL3 = NEW JPANEL ();) JLabel [49]; JLabel y_label = new JLabel ("年份"); jlabel m_label = new JLabel ("月份"); jcombobox com1 = new JCombobox (); jcombobox com2 = new jcomboBox (); jbutton bouth; x_size, y_size; string year_num; calendar maintenant = calendar.getInstance (); // 实例化 calendarmainFrame () {super ("万年历 -jackbase"); setSize (300,350); x_size = (int) (toolkit.getDefaultToolkit (). GetScreenSing (). GetWidth ()); y_size = (int) (getheiirei ght ()); setLocation ((x_size-300) / 2, (y_size-350) / 2); setDefaultCloseOperation (jframe.exit_on_close); Panel1.Add (y_label); Panel1.Add (com1); Panel1.add (m_label); Pannel1.Add (com2); Panel1.add (bouton); pour (pour (pour bouton); i = 0; i <49; i ++) {label = new JLabel ("", jLabel.Center); // 将显示的字符设置为居中 PANNEL2.ADD (Label);} PANNEL3.Add (nouveau Clock (This)); Panel.Add (Panel1, BorderLayout.North); Panel.Add (Panel2, BorderLayout.Center); Panel.Add (Panel3, BorderLayout.South); Panel.SetBackground (Color.White); Panne.SetBackground (Color.White); init (); bouton. ActionListener () {public void ActionPerformed (ActionEvent e) {int c_year, c_month, c_week; c_year = Integer.parseint (com1.getSelectedItem (). ToString ()); // 得到当前月份 , 并减 1, 计算机中的月为 0-11c_week = use (c_year, c_month); // 调用函数 Utiliser , 得到星期几 Resetday (c_week, c_year, c_month); // 调用函数 réinitialisation}}); setContentPane (panneau); setVisible (true); setReSizable (false);} public void init () {int an, mens_num, premier_day_num; String log [] = {"日", "一", "二", "三", "四", "五", "六". i = 0; i <7; i ++) {label.setText (log);} pour (int i = 0; i <49; i = i + 7) {label.setForeground (colore.red); // 将星期日的日期设置为红色} pour (int i = 6; i <49; i = i + 7) {label.setForeground (Color.red); // 将星期六的日期也设置为红色} pour (int i = 1; i <10000; i ++) {com1.additem ("" + i);} pour (int (int i = 1; i <13; i ++) {com2.Additem ("" + i);} MOIND_NUM = (int) (maintenant.get (calendar.month)); // 得到当前时间的月份 année = (int) (maintenant.get (calendar.year)); // 得到当前时间的年份 COM1.SetselectedIndex (année-1); // 设置下拉列表显示为当前年 com2.SetSelectedIndex (Month_Num); // 设置下拉列表显示为当前月 premier_day_num = use (Year, Month_Num); resetday (first_day_num, année, mois_num);} public int use (int Reyear, int remonth) {int semaine_num; maintenant.set (reyear, remonth, 1); // 设置时间为所要查询的年月的第一天 week_num = (int) (now.get (calendar.day_of_week)); // 得到第一天的星期 return week_num;} public void resetday (int semaine_log, int an_log, int mois_log) {int mois_score_log; // 判断是否是闰年的标记 int mois_day_score; // 存储月份的天数 int count; mois_score_log = 0; mois_day_score = 0; count = 1; if (année_log% 4 == 0 && année_log% 100! = 0 || an_log% 400 == 0) {// 判断是否为闰年 mois_score_log = 1;} mois_log = mois_log + 1; // 将传来的月份数加 1Switch (Month_log) {Cas 1: Cas 3: Cas 5: Cas 7: Cas 8: Cas 10: Cas 12: MOIND_DAY_SCORE = 31; Break; Cas 4: Case 6: Case 9: Cas 11: Month_day_score = 30; Break; Cas 2: if (Month_score_log == 1) {Monthday_Score = 29; } else {Month_day_score = 28;} Break;} pour (int i = 7; i <49; i ++) {// 初始化标签 label.setText ("");} semaine_log = semaine_log + 6; // 将星期数加 6 , 使显示正确 mois_day_score = mois_day_score + semaine_log; pour (int i = semaine_log; i <mois_day_score; i ++, count ++) {label.settext (count + "");}}} // 创建时钟 class Class Class étend que les canaux (mainframe impulsionnable {MainFrame mf; thread t; thread T; mf) {this.mf = mf; setSize (400,40); setbackground (color.white); t = new thread (this); // 实例化线程 t.start (); // 调用线程} public void run () {while (true) {try {t.sleep (1000); // 休眠 1 秒钟} catch (InterruptedException e) {System.out.println ("异常");} this.repaint (100);}} public void peinture (graphics g) {font f = new Font ("宋体", Font.Bold, 16); SimpledateFormat sdf = new SimpledateFormat ("yyyy '年' mm '月' dd '日' hh: mm: ss"); // 格式化时间显示类型 calendar maintenant = calendar.getInstance (); time = sdf.format (maintenant.getTime ()); // 得到当前日期和时间 g.setfont (f); g.setColor (colore.red); g.drawstring (time, 100,25);}} public class wnl {public static void main (String [] args) {jframe.setdefaultlookEndFeelDecoRed (true); mainframe start = new MainFrame ();}}}}以上就是 Java 实现万年历的资料 , 希望能帮助实现该功能的朋友 , 谢谢大家对本站的支持!