用JAVA编写日历,要求输入年月,显示那个月的日期和星期几求思路 别粘贴复制代码

解决方案 »

  1.   

    用unix最简单, 直接调用系统的cal命令就可以了。如果全部自己算,date中本来就有方法返回星期几的。 唯一麻烦的是先算出当月多少天(注意闰年就行了),然后 每行7个数显示。如果要从星期日开始显示,多几个空格就行了。
      

  2.   

    将日期字符串转换为Date类型,然后通过calendar类里面有好多的静态常量,例如DAY_OF_MONTH 等等,很容易
      

  3.   

    楼主的意思不是自己编写算法实现吧!要是这样的话,就去网上找,记得上学那会看过这个算法,比较复杂。
    若楼主是用java中的API来实现。可以看看下面,我刚才看到楼主的帖子就简单实现了一个。import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Calendar;
    import java.util.Scanner;
    public class Cal {
    public static void main(String[] args) {
    Scanner input = new Scanner(System.in);
    System.out.println("请输入年月:(格式:2011-03)");
    String str = input.next();
    Calendar cal = getCalendar(str);
    print(cal);
    }


    private static Calendar getCalendar(String str) {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
    Calendar cal = Calendar.getInstance();
    cal.setFirstDayOfWeek(Calendar.MONDAY);//设置一周的第一天为星期一
    try {
    cal.setTime(sdf.parse(str));
    } catch (ParseException e) {
    System.out.println("输入的日期格式有问题,请输入年月:(2010-01)");
    }
    return cal;
    }

    /**
     * 得到这个月有多少天,考虑闰年的问题
     * @param date
     */
    private static int getDays(Calendar cal) {
    int year = cal.get(Calendar.YEAR);
    int month = cal.get(Calendar.MONTH) + 1;

    int days = 0;
    switch(month) {
    case 1:
    case 3:
    case 5:
    case 7:
    case 8:
    case 10:
    case 12:
    days = 31;
    break;
    case 4:
    case 6:
    case 9:
    case 11:
    days = 30;
    break;
    case 2:
    if((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
    days = 29;
    else
    days = 28;
    break;
    }

    return days;
    }

    private static void print(Calendar cal) {
    System.out.println("星期日 星期一 星期二 星期三 星期四 星期五 星期六");
    int i = 0;
    int space = cal.get(Calendar.DAY_OF_WEEK) - 1;
    for(; i<space; i++) {
    System.out.print("    ");
    }
    int day = cal.get(Calendar.DAY_OF_MONTH);
    for(; i<getDays(cal) + space; i++) {
    System.out.format("%2d   ", day++);
    if((i + 1) % 7 == 0)
    System.out.println();
    }
    }
    }
      

  4.   

    这个是有问题的,我以前写的。近供参考。
    import java.util.*;
    public class Calendar {
      public static void main (String[] args) {
      int years,months,day_1,day_2,sum_1,sum_2,sum,firstDay;
      boolean testYear;
      System.out.print("\n");
      System.out.print("*********欢迎使用万年历查询时间*********");
      System.out.println ("\n");
      System.out.print("请输入年份:");
      Scanner input=new Scanner(System.in);
      years=input.nextInt();
      day_1=0;
      day_2=0;
      sum_1=0;
      sum_2=0;
      sum=0;
      firstDay=0;
      if((years%4==0&&years%100!=0)||years%400==0)
      {
      System.out.println ("\t"+years+"是闰年");
      testYear=true;
      }
      else{
      System.out.println ("\t"+years+"是平年");
      testYear=false;
      }
      for(int i=1900;i<years;i++)
      {
      if((i%4==0&&i%100!=0)||i%400==0)
      {
      day_1=366;
      }
      else
      {
      day_1=365;
      }
      sum_1=sum_1+day_1; //计算从输入年份1月1号到1900年1月1号总天数
      }
      System.out.println ();
      System.out.print("请输入月份:");
      months=input.nextInt();
      /*
      *计算输入的月份到该年份的天数
      */
      for(int j=1;j<months;j++)
      {
      if(j==2)
      {
      if(testYear=true)
      {
      sum_2=29+sum_2;
      }
      else{
      sum_2=28+sum_2;
      }
      }
      else if((j==4)||(j==6)||(j==9)||(j==11))
      {
      sum_2=30+sum_2;
      }
      else
      {
      sum_2=31+sum_2;
      }
      }
      if(months==2)
      {
      if(testYear)
      {
      day_2=29;
      }
      else
      {
      day_2=28;
      }
      }
      else if((months==4)||(months==6)||(months==9)||(months==11))
      {
      day_2=30;
      }
      else
      {
      day_2=31;
      }
      sum=sum_1+sum_2; //累加记录距离1900年1月1号的天数
      System.out.print("\n\n");
      System.out.println ("星期天"+"\t星期一"+"\t星期二"+"\t星期三"+"\t星期四"+
      "\t星期五"+"\t星期六"+"\n");
      int temp=1+sum%7; //计算该月份的第一天是星期几
      /**周一-周六:使用数字1-6表示,周日用0表示*/
      if(temp==7)
      {
      firstDay=0;
      }
      else{
      firstDay=temp;
      }
      for(int nullNo=0;nullNo<firstDay;nullNo++)
      {
      System.out.print("\t"); //循环输出第一行的空格
      }
      for(int x=1;x<=day_2;x++)
      {
      System.out.print(x+"\t");
      if((sum+x-1)%7==5)
      {
      System.out.print("\n");//判断当前日x是否是周六,如果是,换行
      }
      }
      }
    }
      

  5.   


    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
    <title>日期选择</title>
    <script type="text/javascript">
    function displayDateContrl(date){
    var temp=new Date();
    temp.setYear(date.getYear());
    temp.setMonth(date.getMonth());
    temp.setDate(date.getDate());

    var month=date.getMonth();
    var currentDate=date.getDate();
    temp.setDate(1);
    var day=temp.getDay();

    var dateNumber=1;
    document.write("<table border='0' style='text-align:center'>");
    document.write("<tr><td>星期日</td><td>星期一</td><td>星期二</td><td>星期三</td><td>星期四</td><td>星期五</td><td>星期六</td></tr>");
    document.write("<tr>");
    for(var i=0;i<day;i++){
    document.write("<td></td>");
    }

    while(true){

    document.write("<td>");
    if(dateNumber==currentDate){
    document.write("<font color='red'>");
    document.write(dateNumber);
    document.write("</font>");
    }else{
    document.write(dateNumber);
    }
    document.write("</td>");

    if((dateNumber+day)%7==0){
    document.write("</tr>");
    }


    if(dateNumber>=currentDate){


    date.setDate(date.getDate()+1);
    }
    if(date.getMonth()!=month){

    break;
    }
    if((dateNumber+day)%7==0){
    document.write("<tr>");
    }
    dateNumber++;

    }
    while((dateNumber+day)%7!=0){
    document.write("<td></td>");
    dateNumber++;
    }
    document.write("</tr>");
    document.write("</table>");
    }
    var t=new Date();

    displayDateContrl(t);
    </script>
    </head><body></body>
    </html>
      

  6.   

    http://www.javaeye.com/topic/285405
    可以参考下~
      

  7.   

    基本思路就是根据java的calendar类的方法获取需要输出月历的月份的1日是星期几,然后,根据闰年的计算规则计算该月份的天数,接下来就是输出,按照如下规则输出。
    1.输出 一  二。 日,每个用\t隔开
    2.根据刚才计算出来的当月1日是星期几做循环输出几个\t的位置。目的就是使当月的1日输出到适当的位置。
    3.做循环输出从1日到该月最后一天,每输出7次输出一个换行,注意这里要包含第二步中输出\t的次数。
    不知道能看明白吗?
      

  8.   

    Gregorian类就是专门为计算这些星期月份等来准备的。推荐LZ搜一下Gregorian的用法
      

  9.   

    这个有意思~如果是我,我的思路会是这样,1、仔细调查太阳历的历法规则
    2、以“一年365天”为基准做求值:
    2.1、确定星期:用365对7取余的方式确定
    2.2、确定月份:例如:一年中的第42天:31(一月界限)<42<59(二月界限),所以这一天在2月
    2.3、润一下……在365基础上加一天
    3、拿出草稿纸计算一下公元1年1月1号是星期一,那么轮到下一个周一需要多久,中间每年的变化如何,继续用取余的方式对后面的“年”的1月1日的星期取值
      

  10.   


    package DK_Date;import java.util.Date;public class DK_Date {    public int Year; // 年份
        public int Month; // 月份
        public int Day; // 日期
        public int Days; // 当月有几天
        public int Week; // 当月第一天为周几    public void getCurDate() {
            Date date = new Date();        this.Year = date.getYear() + 1900;
            this.Month = date.getMonth() + 1;
            this.Day = date.getDate();
        }    /**
         * 判断是否为闰年
         * 
         * @param year
         * @return 如果为真则为闰年,反之为平年
         */
        public boolean isRun(int year) {
            if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0 )
                return true;
            return false;
        }    /**
         * 计算当月天数
         * 
         * @param month
         *            月份
         * @param year
         *            年份
         */
        public void getDays(int month, int year) {
            switch (month) {
            case 2:
                if (isRun(year))
                    this.Days = 29;
                else
                    this.Days = 28;
                break;
            case 4:
            case 6:
            case 9:
            case 11:
                this.Days = 30;
                break;
            default:
                this.Days = 31;
                break;
            }
        }    /**
         * 计算当月第第一天是一年中的第几天
         * 
         * @param month
         * @param year
         * @return
         */
        public int getYearDays(int month, int year) {
            int days = 1;
            for (int i = 1; i < month; i++) {
                switch (i) {
                case 2:
                    if (isRun(year))
                        days += 29;
                    else
                        days += 28;
                    break;
                case 4:
                case 6:
                case 9:
                case 11:
                    days += 30;
                    break;
                default:
                    days += 31;
                    break;
                }
            }
            return days;
        }    /**
         * 计算1900年到当年1月1日经过了多少天
         * 
         * @param year
         *            当前年份
         * @return
         */
        public int getYearsDay(int year) {
            int days = 0;
            for (int i = 1900; i < year; i++) {
                if (isRun(i))
                    days += 366;
                else
                    days += 365;
            }
            return days;
        }    /**
         * 计算当月第一天为周几
         * 
         * @param year
         *            年份
         * @param month
         *            月份
         */
        public void getWeek(int year, int month) {
            int days = getYearsDay(year) + getYearDays(month, year);
            this.Week = days % 7 == 0 ? 7 : days % 7;
        }
    }
    package DK_Date;import java.util.Scanner;public class DateUI {    private DK_Date date;
        Scanner scanner = new Scanner(System.in);    public void initial() {
            date = new DK_Date();
            date.getCurDate();
            date.getWeek(date.Year, date.Month);
            date.getDays(date.Month, date.Year);
        }    public void show() {
            System.out.println("◆◇◆◇◆◇    DK 万年历    ◆◇◆◇◆◇\n");
            System.out.println("北京时间:" + date.Year + "年" + date.Month + "月"
                    + date.Day + "日\n");
            getShow(date.Week, date.Days);
            while (true) {
                System.out.println("\n请输入年份:");
                date.Year = scanner.nextInt();
                System.out.println("请输入月份:");
                date.Month = scanner.nextInt();
                date.getWeek(date.Year, date.Month);
                date.getDays(date.Month, date.Year);
                getShow(date.Week, date.Days);
            }
        }    public void getShow(int week, int days) {
            System.out.println("周日\t周一\t周二\t周三\t周四\t周五\t周六\t");
            if (week != 7) {
                for (int i = 0; i < week; i++) {
                    System.out.print("\t");
                }
            }
            for (int i = 1; i <= days; i++) {
                System.out.print(i + "\t");
                if (i % 7 == 7 - week) {
                    System.out.println();
                }
            }
        }
    }package DK_Date;public class Start {    public static void main(String[] args)
        {
            DateUI date = new DateUI();
            date.initial();
            date.show();
        }
    }
      

  11.   

    这是我写的带界面的日历。用Eclipse 的Gregorian类来实现你所说的功能的
    package cal;import java.awt.BorderLayout;
    import java.awt.EventQueue;import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.border.EmptyBorder;
    import javax.swing.JLabel;
    import javax.swing.JButton;
    import java.awt.GridLayout;
    import java.awt.Color;
    import java.awt.event.ActionListener;
    import java.awt.event.ActionEvent;
    import java.util.Calendar;
    import java.util.GregorianCalendar;public class CalenderTest extends JFrame { /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private JPanel contentPane;
    GregorianCalendar gre = new GregorianCalendar();
    JLabel labels[][] = new JLabel[6][7];
    int month = gre.get(Calendar.MONTH);
    int year = gre.get(Calendar.YEAR);
    int first = gre.get(Calendar.DAY_OF_MONTH);
    //String [] monthDay={"31","28","31","30","31","30","31","31","30","31","30","31"}; 
    int[] monthDay={31,28,31,30,31,30,31,31,30,31,30,31}; 
    JLabel label1 = new JLabel("\u65E5\u5386\uFF1A");
    /**
     * Launch the application.
     */
    public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
    public void run() {
    try {
    CalenderTest frame = new CalenderTest();
    frame.setVisible(true);
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    });
    } /**
     * Create the frame.
     */
    public CalenderTest() {
    this.setTitle("My Calender");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 450, 300);
    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    BorderLayout layout = new BorderLayout(0, 0);
    layout.setHgap(10);
    contentPane.setLayout(layout);
    setContentPane(contentPane);
    {
    JPanel panel = new JPanel();
    contentPane.add(panel, BorderLayout.NORTH);
    {
    JButton button = new JButton("\u4E0A\u6708");
    button.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
    if(month==0){
    year--;
    month = 11;
    }
    else{
    month--;
    }
    label1.setText("\u65E5\u5386\uFF1A"+year+"年"+(month+1)+"月");
    // System.out.println(year+" "+(month+1));
    gre.set(GregorianCalendar.YEAR,year);
    gre.set(GregorianCalendar.MONTH, month);
    for(int i = 0;i <labels.length; i++){
    for(int j = 0;j<labels[i].length;j++){
    labels[i][j].setText("");
    }
    }
    init();
    }
    }); 
    panel.add(button);
    }
    {
    JButton button = new JButton("\u4E0B\u6708");
    button.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
    if(month==11){
    year++;
    month = 0;
    }
    else
    {
    month++;
    }
    label1.setText("\u65E5\u5386\uFF1A"+year+"年"+(month+1)+"月");
    for(int i = 0;i <labels.length; i++){
    for(int j = 0;j<labels[i].length;j++){
    labels[i][j].setText("");
    }
    }
    gre.set(GregorianCalendar.YEAR,year);
    gre.set(GregorianCalendar.MONTH, month);
    init();
    } });
    panel.add(button);
    }
    }
    {
    JLabel label = new JLabel("");
    contentPane.add(label, BorderLayout.WEST);
    }
    {
    JLabel label = new JLabel("");
    contentPane.add(label, BorderLayout.EAST);
    }
    {
    JPanel panel = new JPanel();
    contentPane.add(panel, BorderLayout.CENTER);
    panel.setLayout(new GridLayout(7, 7, 0, 0));
    {
    JLabel label = new JLabel("\u65E5");
    label.setBackground(Color.GRAY);
    panel.add(label);
    }
    {
    JLabel label = new JLabel("\u4E00");
    label.setBackground(Color.GRAY);
    panel.add(label);
    }
    {
    JLabel label = new JLabel("\u4E8C");
    label.setBackground(Color.GRAY);
    panel.add(label);
    }
    {
    JLabel label = new JLabel("\u4E09");
    label.setBackground(Color.GRAY);
    panel.add(label);
    }
    {
    JLabel label = new JLabel("\u56DB");
    label.setBackground(Color.GRAY);
    panel.add(label);
    }
    {
    JLabel label = new JLabel("\u4E94");
    label.setBackground(Color.GRAY);
    panel.add(label);
    }
    {
    JLabel label = new JLabel("\u516D");
    label.setBackground(Color.GRAY);
    panel.add(label);
    }
    for(int i = 0;i<labels.length; i++){
    for(int j = 0;j<labels[i].length; j++){
    labels[i][j] = new JLabel();
    labels[i][j].setBackground(Color.white);
    labels[i][j].setOpaque(true);
    panel.add(labels[i][j]);
    }
    }

    init();
    }
    {
    JPanel panel = new JPanel();
    contentPane.add(panel, BorderLayout.SOUTH);
    {
    label1.setText("\u65E5\u5386\uFF1A"+year+"年"+(month+1)+"月");
    panel.add(label1);
    }
    } } public void init(){
    int temMonth = month;
    gre.set(Calendar.DAY_OF_MONTH,1); 
    int days = monthDay[temMonth];
    gre.set(Calendar.YEAR,year);
    boolean isYear = gre.isLeapYear(year);
    if(isYear&&temMonth==1){
    days=29;
    }
    int tem =gre.get(Calendar.DAY_OF_WEEK) ;
    if(tem==1){
    tem=8;
    }
    boolean flag = true;
    String str = " ";
    int day = 0;
    for(int i = 0; i<labels.length; i++){
    for(int j = 0; j<labels[i].length; j++){
    if(flag){
    while(j<(tem-1)){
    labels[i][j].setText(str);
    j++;
    flag = false;
    }
    j--;
    }
    else if(day<days){
    str = Integer.toString(day+1);
    labels[i][j].setText(str);
    day++;
    }
    }
    }
    }
    }