Java 實(shí)現(xiàn)萬(wàn)年歷總結(jié)
一,Java實(shí)現(xiàn)萬(wàn)年歷的代碼:
package calendar;
import java.util.Scanner;//日歷項(xiàng)目
public class RiLi{
public static void main(String[] args){
Scanner A=new Scanner(System.in);
System.out.println("請(qǐng)輸入年份:");
int year=A.nextInt();
System.out.println("請(qǐng)輸入月份:");
int month=A.nextInt();
int sum=0;
for(int i=1900;i<year;i++){
if(i%4==0&&i%100!=0||i%400==0){
sum=sum+366;
}else{
sum=sum+365;
}
}
for(int i=1;i<month;i++){
if(i==2){
if(year%4==0&&year%100!=0||year%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=sum%7;
System.out.println("日\(chéng)t一\t二\t三\t四\t五\t六");
for(int i=1;i<=wekday;i++){
System.out.print("\t");
}
int f=0;
if(month==4||month==6||month==9||month==11){
f=30;}
if(month==1||month==3||month==5||month==7||month==8||month==10||month==12){f=31;}
if(month==2){
if(year%4==0&&year%100!=0||year%400==0){f=29;}
else{f=28;}
}
for(int i=1;i<=f;i++){
if(sum%7==6){
System.out.print(i+"\n");
}else{
System.out.print(i+"\t");
}
sum++;
}
}
}
二.一個(gè)Java萬(wàn)年歷,比較簡(jiǎn)單的那種,顯示年月日、星期幾、當(dāng)前日期是第幾周、顯示閏年、打印萬(wàn)年歷等,還可顯示當(dāng)前日期是一年中的第幾天,指定日期是星期幾等,采用了基姆拉爾森計(jì)算公式 ,W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7 ,在公式中d表示日期中的日數(shù),m表示月份數(shù),y表示年數(shù)。注意:在公式中有個(gè)與其他公式不同的地方: 把一月和二月看成是上一年的十三月和十四月,例:如果是2004-1-10則換算成:2003-13-10來(lái)代入公式計(jì)算。
public class myCalendar {
//以下程序段是用來(lái)計(jì)算輸入日期為該年的第幾天的
public static int cptDay(int year , int month , int day){
byte dayadd[]={1,-2,1,0,1,0,1,1,0,1,0,1}; //用來(lái)存儲(chǔ)每個(gè)月天數(shù)和30的差值
int daycount = 0; //這是天數(shù)daycount計(jì)數(shù)器,初始化為0
for(int i=0; i<month-1; i++)
daycount+=(30+dayadd[i]);
daycount+=day;
return (month>2)?daycount+isLeap(year):daycount;
}
//閏年判定程序段,閏年返回1,平年返回0
public static int isLeap(int year){
if((year%400==0)||((year%4==0)&&(year%100!=0)))
return 1;
return 0;
}
//計(jì)算輸入日期是星期幾
//采用了基姆拉爾森計(jì)算公式
//W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7
//在公式中d表示日期中的日數(shù),m表示月份數(shù),y表示年數(shù)。
//注意:在公式中有個(gè)與其他公式不同的地方:
//把一月和二月看成是上一年的十三月和十四月,例:如果是2004-1-10則換算成:2003-13-10來(lái)代入公式計(jì)算。
public static int getWeek(int year,int month,int day){
if(month<3)
{ month+=12; year--;}
return (day+2*month+3*(month+1)/5+year+year/4-year/100+year/400)%7;
}
//以下程序段是來(lái)計(jì)算輸入日期為該年第幾周的
public static int weekCount(int year,int month,int day){
int dayCnt = cptDay(year,month,day);
int weekminus = getWeek(year,month,day)-getWeek(year,1,1);
int weekCnt = 0;
if(dayCnt%7==0) weekCnt = dayCnt/7+((weekminus>0)?1:0);
else weekCnt = dayCnt/7+((weekminus>0)?2:1);
return weekCnt;
}
//打印萬(wàn)年歷
public static void printCal(int year){
byte dayadd[]={0,1,-2,1,0,1,0,1,1,0,1,0,1}; //同樣的,每月天數(shù)和30的差值,注意,dadadd[0]的0并沒(méi)用到
int wkpoint = getWeek(year,1,1); //wkpoint用來(lái)指出當(dāng)前日期的星期數(shù)
int t = 0; //t用來(lái)作為一個(gè)標(biāo)記器,解決閏年2月有29天的問(wèn)題
int bk = 0; //bk用來(lái)記錄需輸空白的數(shù)目
String week[]={"星期一","星期二","星期三","星期四","星期五","星期六","星期日"};
for(int i=1;i<13;i++)
{
t = 0;
bk = 0;
if((i==2)&&(isLeap(year)==1))
t = 1; //當(dāng)且僅當(dāng)閏年的2月份才將其置為1
System.out.println("\n\n\t\t"+year+" 年 "+i+" 月\n");
for(int j=0;j<7;j++)
System.out.print(week[j]+"\t");
System.out.println();
while(bk++<wkpoint)
System.out.print('\t');
for(int j=1;j<=(30+dayadd[i]+t);j++)
{
System.out.print(j+"\t"); //循環(huán)輸出每月日期
if(wkpoint==6)
{ wkpoint = 0; System.out.print('\n');} //當(dāng)wkpoint計(jì)數(shù)器為6時(shí)將其置為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)+"周 "+week[getWeek(2009,2,15)]);
printCal(2009);
}
}
三、
1.用戶(hù)輸入信息-->進(jìn)行信息判斷(是否符合要求)
2.以1900年1月1日(星期一)為基準(zhǔn),計(jì)算1900年1月1日至當(dāng)日的總天數(shù)
(1)先計(jì)算1900年至(用戶(hù)輸入的年 - 1)的總天數(shù) -->注意平閏年之分
(2)計(jì)算用戶(hù)輸入年份的1月至(用戶(hù)輸入月份 - 1)的天數(shù)
3.計(jì)算輸入月份的第一天是星期幾
4.格式化輸出
以下我們按照步驟一步一步進(jìn)行代碼解析
一)、利用do-while循環(huán)接受用戶(hù)輸入信息,并利用if-else語(yǔ)句進(jìn)行判斷
int year;
int month;
boolean xn = false;
do
{
System.out.println("請(qǐng)輸入年份:");
year = input.nextInt();
System.out.println("請(qǐng)輸入月份:");
month = input.nextInt();
//利用boolean類(lèi)型的表達(dá)式進(jìn)行輸入信息的判斷
xn = (month < 1) || (month > 12) ||(year < 1);
if(xn)
{
System.out.println("輸入信息錯(cuò)誤,請(qǐng)重新輸入!");
}
}while(xn);
二)、判斷平閏年,并計(jì)算1900年至(用戶(hù)輸入年 - 1)的總天數(shù)
int everyYearDay = 0; //每年的天數(shù)
int totalYearsDays = 0; //計(jì)算年的天數(shù)
int inputYearDay = 0 //記錄用戶(hù)輸入年的天數(shù)
boolean yn = false; //標(biāo)識(shí)平閏年
//利用for循環(huán)計(jì)算天數(shù)
for(int i = 1900;i < =year;i ++)
{
if(((i % 4 == 0)&&(i % 100 != 0))||(i % 400 == 0)) //閏年的判斷條件
{
yn = true;
everyYearDay = 366;
}
else
{
yn = false;
everyYearDay = 365;
}
//如果循環(huán)中的年份小于用戶(hù)輸入的年份,則累積天數(shù)
if(i < year)
{
totalYearsDays = totalYearsDays + everyYearDay;
}
else
{
inputYearDay = everyYearDay;
System.out.println(year + "年共有:" + inputYearDay + "天");
}
}
三)、判斷月份的天數(shù),并計(jì)算當(dāng)年1月至(用戶(hù)輸入月份 -1)的天數(shù)
int everyMonthDay = 0; //記錄每月的天數(shù)
int totalMonthsDays = 0; //總天數(shù)
int inputMonthDay = 0; //記錄用戶(hù)輸入的月份在用戶(hù)輸入年份的天數(shù)
//利用for循環(huán)計(jì)算天數(shù)
for(int i = 1;i <= month;i ++)
{
switch(i)
{
case 4:
case 6:
case 9:
case 11:
everyMonthDay = 30;
break;
case 2:
if(xn) //xn是用來(lái)記錄平閏年的boolean類(lèi)型的變量
{
everyMonthDay = 29;
}
else
{
everyMonthDay = 28;
}
break;
default:
everyMonthDay = 31;
break;
}
if(i < month)
{
totalMonthsDays = totalMonthsDays + everyMonthDay;
}
else
{
inputMonthDay = everyMonthDay;
System.out.println(month + "月共有:" + inputMonthDay + "天");
}
}
四)、計(jì)算總天數(shù),并計(jì)算出用戶(hù)輸入的月份的第一天星期幾
int total = totalMonthsDays + totalYearsDays; //計(jì)算總天數(shù)
int temp = (total + 1) % 7; //判斷輸入月份的第一天星期幾
五)、格式化輸出
//因?yàn)槲覀兊妮斎敫袷绞?
//星期日 星期一 星期二 星期三 星期四 星期五 星期六
//當(dāng)星期日時(shí)的時(shí)候,我們直接輸出就好了,但是當(dāng)
//第一天是星期一的時(shí)候,我們就必須首先打印出空格
//然后再輸出日期,才能讓號(hào)碼和星期想對(duì)應(yīng)
//打印空格
for(int spaceno = 0;spaceno < temp;spaceno ++)
{
System.out.print("/t");
}
//按照順序打印號(hào)碼
for(int i = 1;i <= inputMonthDay;i ++)
{
if((total + i ) % 7) //判斷是否該換行了
{
System.out.println(i );
}
else
{
System.out.print(i + "/t");
}
}
四、 java(用calendar類(lèi))寫(xiě)一個(gè)萬(wàn)年歷,輸入年并且顯示當(dāng)年的日歷
public class MyCalendar {
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
Calendar c = Calendar.getInstance();
System.out.println("請(qǐng)輸入數(shù)字年:(比如 2014)");
int year = sc.nextInt();
sc.close();
// int year = 2014;
c.set(Calendar.YEAR,year);
for (int i = 0; i < 12; i++) {
c.set(Calendar.MONTH,i); //
c.set(Calendar.DATE,1); //設(shè)置成1月
printMonth(c);
}
}
public static void printMonth(Calendar c){
c.set(Calendar.DAY_OF_MONTH,1); //設(shè)置成一日
System.out.printf("\n\n========= %s 月 =========\n",c.get(Calendar.MONTH)+1);
String[] weeks = { "日", "一" , "二", "三", "四", "五", "六" };
for (int i = 0; i < weeks.length; i++) {
System.out.printf("%s" + (i != 6 ?"\t":"\n"),weeks[i]);
}
int offday = c.get(Calendar.DAY_OF_WEEK) - 1;
for(int i = 0; i < offday; i++){
System.out.printf("\t");
}
int month = c.get(Calendar.MONTH);
while(c.get(Calendar.MONTH) == month ){
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);
}
}
}
五、程序:萬(wàn)年歷+時(shí)鐘小程序?qū)崿F(xiàn)
java知識(shí)點(diǎn)有:java常用內(nèi)庫(kù)與工具(Date類(lèi)、Calendar類(lèi)等)、異常(try.....catch)、線(xiàn)程、AWT圖形用戶(hù)界面等基礎(chǔ)知識(shí)點(diǎn)。

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.text.*;
import java.util.*;
//創(chuàng)建窗口和年歷
class MainFrame extends JFrame{
JPanel panel=new JPanel(new BorderLayout());//BorderLayout為邊界布局
JPanel panel1=new JPanel();
JPanel panel2=new JPanel(new GridLayout(7,7));//GridLayout為網(wǎng)格布局
JPanel panel3=new JPanel();
JLabel []label=new JLabel[49];
JLabel y_label=new JLabel("年份");
JLabel m_label=new JLabel("月份");
JComboBox com1=new JComboBox();
JComboBox com2=new JComboBox();
JButton button=new JButton("查看");
int re_year,re_month;
int x_size,y_size;
String year_num;
Calendar now=Calendar.getInstance(); //實(shí)例化Calendar
MainFrame(){
super("萬(wàn)年歷-Jackbase");
setSize(300,350);
x_size=(int)(Toolkit.getDefaultToolkit().getScreenSize().getWidth());
y_size=(int)(Toolkit.getDefaultToolkit().getScreenSize().getHeight());
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);
panel1.add(com2);
panel1.add(button);
for(int i=0;i<49;i++){
label=new JLabel("",JLabel.CENTER);//將顯示的字符設(shè)置為居中
panel2.add(label);
}
panel3.add(new Clock(this));
panel.add(panel1,BorderLayout.NORTH);
panel.add(panel2,BorderLayout.CENTER);
panel.add(panel3,BorderLayout.SOUTH);
panel.setBackground(Color.white);
panel1.setBackground(Color.white);
panel2.setBackground(Color.white);
panel3.setBackground(Color.white);
Init();
button.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
int c_year,c_month,c_week;
c_year=Integer.parseInt(com1.getSelectedItem().toString()); //得到當(dāng)前所選年份
c_month=Integer.parseInt(com2.getSelectedItem().toString())-1; //得到當(dāng)前月份,并減1,計(jì)算機(jī)中的月為0-11
c_week=use(c_year,c_month); //調(diào)用函數(shù)use,得到星期幾
Resetday(c_week,c_year,c_month); //調(diào)用函數(shù)Resetday
}});
setContentPane(panel);
setVisible(true);
setResizable(false);
}
public void Init(){
int year,month_num,first_day_num;
String log[]={"日","一","二","三","四","五","六"};
for(int i=0;i<7;i++){
label.setText(log);
}
for(int i=0;i<49;i=i+7){
label.setForeground(Color.red); //將星期日的日期設(shè)置為紅色
}
for(int i=6;i<49;i=i+7){
label.setForeground(Color.red);//將星期六的日期也設(shè)置為紅色
}
for(int i=1;i<10000;i++){
com1.addItem(""+i);
}
for(int i=1;i<13;i++){
com2.addItem(""+i);
}
month_num=(int)(now.get(Calendar.MONTH)); //得到當(dāng)前時(shí)間的月份
year=(int)(now.get(Calendar.YEAR)); //得到當(dāng)前時(shí)間的年份
com1.setSelectedIndex(year-1); //設(shè)置下拉列表顯示為當(dāng)前年
com2.setSelectedIndex(month_num); //設(shè)置下拉列表顯示為當(dāng)前月
first_day_num=use(year,month_num);
Resetday(first_day_num,year,month_num);
}
public int use(int reyear,int remonth){
int week_num;
now.set(reyear,remonth,1); //設(shè)置時(shí)間為所要查詢(xún)的年月的第一天
week_num= (int)(now.get(Calendar.DAY_OF_WEEK));//得到第一天的星期
return week_num;
}
public void Resetday(int week_log,int year_log,int month_log){
int month_score_log; //判斷是否是閏年的標(biāo)記
int month_day_score; //存儲(chǔ)月份的天數(shù)
int count;
month_score_log=0;
month_day_score=0;
count=1;
if(year_log%4==0&&year_log%100!=0||year_log%400==0){//判斷是否為閏年
month_score_log=1;
}
month_log=month_log+1; //將傳來(lái)的月份數(shù)加1
switch(month_log){
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
month_day_score=31;
break;
case 4:
case 6:
case 9:
case 11:
month_day_score=30;
break;
case 2:
if(month_score_log==1){
month_day_score=29;
}
else{
month_day_score=28;
}
break;
}
for(int i=7;i<49;i++){ //初始化標(biāo)簽
label.setText("");
}
week_log=week_log+6; //將星期數(shù)加6,使顯示正確
month_day_score=month_day_score+week_log;
for(int i=week_log;i<month_day_score;i++,count++){
label.setText(count+"");
}
}
}
//創(chuàng)建時(shí)鐘
class Clock extends Canvas implements Runnable{
MainFrame mf;
Thread t;
String time;
Clock(MainFrame mf){
this.mf=mf;
setSize(400,40);
setBackground(Color.white);
t=new Thread(this); //實(shí)例化線(xiàn)程
t.start(); //調(diào)用線(xiàn)程
}
public void run(){
while(true){
try{
t.sleep(1000); //休眠1秒鐘
}catch(InterruptedException e){
System.out.println("異常");
}
this.repaint(100);
}
}
public void paint(Graphics g){
Font f=new Font("宋體",Font.BOLD,16);
SimpleDateFormat SDF=new SimpleDateFormat("yyyy'年'MM'月'dd'日'HH:mm:ss");//格式化時(shí)間顯示類(lèi)型
Calendar now=Calendar.getInstance();
time=SDF.format(now.getTime()); //得到當(dāng)前日期和時(shí)間
g.setFont(f);
g.setColor(Color.red);
g.drawString(time,100,25);
}
}
public class Wnl{
public static void main(String [] args){
JFrame.setDefaultLookAndFeelDecorated(true);
MainFrame start=new MainFrame();
}
}
以上就是Java 實(shí)現(xiàn)萬(wàn)年歷的資料,希望能幫助實(shí)現(xiàn)該功能的朋友,謝謝大家對(duì)本站的支持!
相關(guān)文章
Java如何實(shí)現(xiàn)一個(gè)簡(jiǎn)化版的Stream框架
這篇文章主要為大家詳細(xì)介紹了一個(gè)簡(jiǎn)化版的 Stream 實(shí)現(xiàn),展示了如何通過(guò)延遲執(zhí)行來(lái)處理數(shù)據(jù)流,感興趣的小伙伴可以跟隨小編一學(xué)習(xí)一下2024-10-10
Java躲不過(guò)設(shè)計(jì)模式的坑之代理模式詳解
設(shè)計(jì)模式看來(lái)更像是一種設(shè)計(jì)思維或設(shè)計(jì)思想,為你的項(xiàng)目工程提供方向,讓你的項(xiàng)目工程更加健壯、靈活,延續(xù)生命力。本文即將分享的是設(shè)計(jì)模式的其中一種:代理模式,感興趣的可以了解一下2022-09-09
Java中easypoi導(dǎo)入excel文件列名相同的處理方案
這篇文章主要介紹了Java中easypoi導(dǎo)入excel文件列名相同的處理方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
基于Java實(shí)現(xiàn)計(jì)數(shù)排序,桶排序和基數(shù)排序
這篇文章主要為大家詳細(xì)介紹了計(jì)數(shù)排序,桶排序和基數(shù)排序的多種語(yǔ)言的實(shí)現(xiàn)(JavaScript、Python、Go語(yǔ)言、Java),感興趣的小伙伴可以了解一下2022-12-12
java實(shí)現(xiàn)socket從服務(wù)器連續(xù)獲取消息的示例
這篇文章主要介紹了java實(shí)現(xiàn)socket從服務(wù)器連續(xù)獲取消息的示例,需要的朋友可以參考下2014-04-04
Java實(shí)現(xiàn)stream的三個(gè)常用方式(toMap,groupingBy,findFirst)
本文主要介紹了Java實(shí)現(xiàn)stream的三個(gè)常用方式,主要包括toMap,groupingBy,findFirst,具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10
Mybatis聯(lián)合查詢(xún)的實(shí)現(xiàn)方法
本文主要介紹了 Mybatis聯(lián)合查詢(xún)的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01
利用棧使用簡(jiǎn)易計(jì)算器(Java實(shí)現(xiàn))
這篇文章主要為大家詳細(xì)介紹了Java利用棧實(shí)現(xiàn)簡(jiǎn)易計(jì)算器,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-09-09

