English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
1, Java로万年력을 구현하는 코드:
package calendar; import java.util.Scanner;//달력 프로젝트 public class RiLi{ public static void main(String[] args){ Scanner A=new Scanner(System.in); System.out.println("년을 입력하세요:"); int year=A.nextInt(); System.out.println("월을 입력하세요:"); 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; } 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; } } if(i==4||i==6||i==9||i==11{ sum+=30; } sum+=31; } } } sum=sum+1; int wekday=sum%7; System.out.println("일\t일\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"); } 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는 날짜의 일 수를, m은 월 수를, y는 연 수를 나타냅니다. 주의: 공식에서 다른 공식과 다른 점이 있습니다: 일월과二月을 전년도의 십삼월과 십사월로 본다, 예를 들어, 만약2004-1-10그런 다음 변환됩니다:2003-13-10이를 공식에 대입하여 계산하세요.
public class myCalendar { //이 프로그램 구간은 입력 날짜가 해당 해의 몇 번째 날인지 계산하기 위해 있습니다. public static int cptDay(int year , int month , int day){ byte dayadd[]={1,-2,1,0,1,0,1,1,0,1,0,1}; //每个月的天数을 저장합니다30의 차이 int daycount = 0; //이는 일수 daycount 카운터이며, 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; } //입력 날짜가 주일이 몇 번째 날인지 계산합니다. //김라르센 계산 공식을 사용했습니다. //W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7 //공식에서 d는 날짜의 일 수를, m은 월 수를, y는 연 수를 나타냅니다. //주의: 공식에서 다른 공식과 다른 점이 있습니다: //일월과二月을 전년도의 십삼월과 십사월로 본다. 예를 들어, 만약2004-1-10그런 다음 변환됩니다:2003-13-10이를 공식에 대입하여 계산하세요. 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; } //이 프로그램 구간은 입력 날짜가 해당 해의 몇 번째 주인지 계산하기 위해 있습니다. 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; } //만년력을 출력 public static void printCal(int year){ byte dayadd[]={0,1,-2,1,0,1,0,1,1,0,1,0,1}; //또한, 각 월의 일수와30의 차이를 주의하세요. dadadd[0]의 0은 사용되지 않습니다 int wkpoint = getWeek(year,1,1); //wkpoint는 현재 날짜의 요일 수를 가리킵니다 int t = 0; //t는 윤년을 해결하는 표지자로 사용됩니다2월은29날짜 문제 int bk = 0; //bk는 빈 갯수를 기록하기 위해 사용됩니다 for(int i=1;i<13;i++) { t = 0; bk = 0; if((i==2)&&(isLeap(year)==1)) t = 1; //단지 둘 중 하나가 윤년인 경우2월이면 그것을 0으로 설정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"); //월별 날짜를 반복 출력 if(wkpoint==6) { wkpoint = 0; System.out.print('\n');} //wkpoint 카운터가6을 0으로 설정하고 줄 바꿈 else wkpoint++; } } } public static void main(String[] args){ System.out.println("입력한 날짜는 이해의 첫",+2009,2,15)+"일"); System.out.println("이날은 이해의 첫",+weekCount(2009,2,15)+"주 "+week[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 year; int month; boolean xn = false; do { System.out.println("請輸入年份:"); year = input.nextInt(); System.out.println("請輸入月份:"); month = input.nextInt(); //利用boolean型的表達式進行輸入信息的判斷 xn = (month < 1) || (month > 12) ||(year < 1); if(xn) { System.out.println("輸入信息錯誤,請重新輸入!"); } }while(xn);
二)、判斷平閏年,並計算1900年至(用戶輸入年 - 1)的总天数
int everyYearDay = 0; //每年的天數 int totalYearsDays = 0; //計算年的天數 int inputYearDay = 0 //記錄用戶輸入年的天數 boolean yn = false; //標識平閏年 //날짜를 계산하기 위해 for 루프를 사용합니다 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; } //如果循環中的年份小於用戶輸入的年份,則累積天數 if(i < year) { totalYearsDays = totalYearsDays + everyYearDay; } else { inputYearDay = everyYearDay; System.out.println(year + "年共有:" + inputYearDay + "일"); } }
三)、月份的天數判斷,並計算當年1月至(用戶輸入月份 -1的天數
int everyMonthDay = 0; //每月的天數記錄 int totalMonthsDays = 0; //총 일수 int inputMonthDay = 0; //사용자가 입력한 월의 날짜를 기록합니다 //날짜를 계산하기 위해 for 루프를 사용합니다 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은 평년과 윤년을 기록하는 boolean 타입의 변수입니다 { everyMonthDay = 29; } else { everyMonthDay = 28; } break; default: everyMonthDay = 31; break; } if(i < month) { totalMonthsDays = totalMonthsDays + everyMonthDay; } else { inputMonthDay = everyMonthDay; System.out.println(month + "월에는:" + inputMonthDay + "일"); } }
네 번째로, 총 일수를 계산하고 사용자가 입력한 월의 첫 번째 날 요일을 계산합니다
int total = totalMonthsDays + totalYearsDays; //총 일수 계산
int temp = (total + 1) % 7; //입력 월의 첫 번째 날 요일을�断합니다
다섯 번째로, 형식화된 출력
//우리의 입력 형식은 //일요일 월요일 화요일 수요일 목요일 금요일 토요일 //일요일이면 바로 출력할 수 있지만, 일요일이 아니면 //첫 번째 날이 월요일이면, 먼저 공백을 인쇄해야 합니다 //그런 다음 날짜를 출력하여 번호와 요일을 일치시킬 수 있습니다 //공백을 인쇄합니다 for(int spaceno = 0;spaceno < temp;spaceno ++) { System.out.print("/t"); } //순서대로 번호를 인쇄합니다 for(int i = 1;i <= inputMonthDay;i ++) { if((total + i ) % 7) //줄 바꿈이 필요한지�断합니다 { System.out.println(i ); } else { System.out.print(i + "/t"); } }
네번째로, java(caleendar 클래스를 사용하여) 만년력을 작성하고, 연을 입력하면 해당 연의 달력을 표시합니다
public class MyCalendar { public static void main(String args[]) { Scanner sc = new Scanner(System.in); Calendar c = Calendar.getInstance(); System.out.println("请输入数字年:(比如" 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); //설정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[] 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); } } }
5. 프로그램: 만년력+시계 소프트웨어 구현
java의 지식 분야는: java 일반 내부 라이브러리와 도구(날짜 클래스, 캘린더 클래스 등), 예외(try.....catch), 스레드, AWT 그래픽 사용자 인터페이스 등 기본 지식 분야입니다.
import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.text.*; import java.util.*; //创建窗口和年历 class MainFrame extends JFrame{ JPanel panel=new JPanel(new BorderLayout());//BorderLayout為邊界布局 JPanel panel1=new JPanel(); JPanel panel2=new JPanel(new GridLayout(7,7));//GridLayout為網格布局 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(); //實例化Calendar MainFrame(){ super("万年曆-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);//將顯示的字符設置為居中 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()); //得到当前所选年份 c_month = Integer.parseInt(com2.getSelectedItem().toString())-1; //得到当前月份,并减1,计算机中的月为0-11 c_week = use(c_year, c_month); //调用函数use,得到星期几 Resetday(c_week, c_year, c_month); //调用函数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); //将星期日的日期设置为红色 } for(int i=6;i<49;i=i+7{ label.setForeground(Color.red);//将星期六的日期也设置为红色 } 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)); //得到当前时间的月份 year = (int)(now.get(Calendar.YEAR)); //得到当前时间的年份 com1.setSelectedIndex(year-1); //下拉列表显示设置为当前年 com2.setSelectedIndex(month_num); //下拉列表显示设置为当前月 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); //조회할 연도와 월의 첫 번째 날을 설정 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; //윤년 여부 표시 int month_day_score; //월의 일수 저장 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; //전달된 월수를 증가시키기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++{ //레이블 초기화 label.setText(""); } week_log=week_log+6; //주수를 증가시키기6,정확하게 표시 month_day_score=month_day_score+week_log; for(int i=week_log;i<month_day_score;i++,count++{ label.setText(count+"); } } } //시계 생성 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); //쓰레드 인스턴스화 t.start(); //쓰레드 호출 } public void run(){ while(true){ t.sleep(1000); //잠시 멈춤1초 } 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");//시간 표시 형식을 정형화합니다 Calendar now=Calendar.getInstance(); time=SDF.format(now.getTime()); //현재 날짜와 시간을 얻습니다 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로 만든 연간력 자료가 있습니다. 이 기능을 구현하는 사람들에게 도움이 되길 바랍니다. 모두의 사이트 지원에 감사합니다!
고지사항: 본 문서의 내용은 인터넷에서 가져왔으며, 저작권자는 모두 소유합니다. 인터넷 사용자가 자발적으로 기여하고 업로드한 내용으로, 이 사이트는 소유권을 가지지 않으며, 인공 편집을 거치지 않았으며, 관련 법적 책임도 부담하지 않습니다. 저작권 침해가 의심되는 내용이 있으시면, 이메일을 notice#w로 보내 주시기 바랍니다.3codebox.com(이메일을 보내는 경우, #을 @으로 변경하십시오.) 신고를 받고, 관련 증거를 제공하시면, 사이트는 즉시 저작권 침해 내용을 삭제할 것입니다.