English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Java에서 연간 일력 구현 요약

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(이메일을 보내는 경우, #을 @으로 변경하십시오.) 신고를 받고, 관련 증거를 제공하시면, 사이트는 즉시 저작권 침해 내용을 삭제할 것입니다.

추천해 드립니다