`
yhan219
  • 浏览: 11538 次
  • 来自: 成都
社区版块
存档分类
最新评论

Java日历横向输出

 
阅读更多

Java日历横向输出

用了三种方法,第一种是将日历打印出来拼接为字符串,在用字符串操作方法对结果进行操作,比较杂乱,面向过程;第二种是将每个月保存在一个类里,在对这个类进行操作,面向对象,比较简洁,但是对类的操作是面向过程的;第三种是纯粹的面向对象,用了单例模式,个人能力有限,写的比较繁琐:

方法一:

package com.yhan219.demo;

import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Scanner;

public class Main {

    /**
     * 
     * @param startYear
     * @param startMonth
     * @param startDay
     * @param endYear
     * @param endMonth
     * @param endDay
     * @param num:每行显示的日历个数
     * 算法主要思想:输入两个日期,将两个日期之间的日期按照正常日历格式,一个月一个月的输出,存入一个字符串中,将字符串分割为n(
     *           两个日期之间的月数)个字符数组中,再将每个字符数组按行分割,将分割得到的结果存入一个二维数组中即可。
     */
    public static void outprint(int startYear, int startMonth, int startDay, int endYear, int endMonth, int endDay,
            int num) {
        Calendar start = new GregorianCalendar(startYear, startMonth - 1, startDay);// 月份从0开始,按照习惯,应减1
        Calendar end = new GregorianCalendar(endYear, endMonth - 1, endDay);
        if(start.compareTo(end) > 0){
            System.err.println("后面的日期必须大于前面的日期!");
            return;
        }
        int startWeekDay = start.get(Calendar.DAY_OF_WEEK);// 开始日是星期几
        int index = 0;// 索引位置,用以判断是不是周六,周六需换行
        int thisMonth = startMonth;// 记录第几月
        StringBuffer sb = new StringBuffer();
        sb.append(startYear + "年" + thisMonth + "月\t\t\t\t\t\t\n日\t一\t二\t三\t四\t五\t六\t\n");
        for (int i = 0; i < startWeekDay - 1; i++) {// 边界处理,最开始空多少空格
            sb.append("\t");
        }
        while (start.compareTo(end) <= 0) {// 包含末尾那天
            sb.append(start.get(Calendar.DATE) + "\t");
            if ((index++ + startWeekDay) % 7 == 0) {// 周六换行,索引增1
                sb.append("\n");
            }
            start.add(Calendar.DAY_OF_MONTH, 1);// 日期加1
            if (start.get(Calendar.DATE) == 1 && start.compareTo(end) <= 0) {// 跨月处理
                if (thisMonth == 12) {// 跨年处理
                    thisMonth = 0;
                    startYear++;
                }
                for (int i = 0; i < 8 - start.get(Calendar.DAY_OF_WEEK); i++) {// 每月月末后面添加的空格数
                    sb.append("\t");
                }
                sb.append("\n\n" + startYear + "年" + ++thisMonth + "月\t\t\t\t\t\t\n日\t一\t二\t三\t四\t五\t六\t\n");
                for (int j = 0; j < start.get(Calendar.DAY_OF_WEEK) - 1; j++) {// 每月结束换行后第二月开始要空的天数
                    sb.append("\t");
                }
            }
        }
        String[] arr = sb.toString().split("\n\n");// 将获取的日历切割,一个月为一个单位
        String[][] array = new String[arr.length][8];// 保存结果
        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < 8; j++) {
                array[i][j] = "\t\t\t\t\t\t\t";// 初始化结果数组,每行7个空格
            }
        }
        for (int i = 0; i < arr.length; i++) {
            String[] a = arr[i].split("\n");// 每个月的日历按行切割
            for (int j = 0; j < a.length; j++) {
                array[i][j] = a[j];// 将每行结果存入结果,其中i标示第几个数组(月),j表示第几行
            }
        }
        for (int i = 0; i < array.length; i += num) {
            for (int j = 0; j < array[i].length; j++) {
                for (int k = 0; k < num && i + k < array.length; k++) {// 每行显示多个日历
                    System.out.print(array[i + k][j] + "\t");// 每行每个日历之间用空格隔开
                }
                System.out.println();// 每行显示结束换行
            }
            System.out.println();
        }
    }

    public static void main(String[] args) {
        System.out.println("请输入两个日期和每行显示的日历个数(示例:2016 6 1 2017 2 1 3):");
        Scanner scanner=new Scanner(System.in);
        String in = scanner.nextLine();
        try{
            String [] inArr=in.split(" ");
            int startYear=Integer.parseInt(inArr[0]);
            int startMonth=Integer.parseInt(inArr[1]);
            int startDay=Integer.parseInt(inArr[2]);
            int endYear=Integer.parseInt(inArr[3]);
            int endMonth=Integer.parseInt(inArr[4]);
            int endDay=Integer.parseInt(inArr[5]);
            int num=Integer.parseInt(inArr[6]);
            outprint(startYear, startMonth, startDay, endYear, endMonth, endDay, num);
        }catch(Exception e){
            System.err.println("输入格式错误!");
        }finally {
            scanner.close();
        }

    }

}

方法二:

封装的MyMonth记录每月信息:

package com.yhan219.demo.javabase;

public class MyMonth {
    private int year;
    private int month;
    private int [][] weeks=new int[6][7];//用一个二维数组按周保存日期,每个月最多跨域6周(行),每周7天(列)

    public MyMonth() {
        super();
        // TODO Auto-generated constructor stub
    }

    public MyMonth(int year, int month) {
        super();
        this.year = year;
        this.month = month;
    }

    public int getYear() {
        return year;
    }

    public void setYear(int year) {
        this.year = year;
    }

    public int getMonth() {
        return month;
    }

    public void setMonth(int month) {
        this.month = month;
    }

    public int[][] getWeeks() {
        return weeks;
    }

    public void setWeeks(int[][] weeks) {
        this.weeks = weeks;
    }
}

类操作

package com.yhan219.demo.javabase;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.List;

public class Main {

    public MyMonth getMyMonth(int year,int month){//将每月填充入二维数组
        MyMonth myMonth=new MyMonth(year,month);
        Calendar start=new GregorianCalendar(year,month-1,1);//月初
        Calendar end=new GregorianCalendar(year,month,1);//月末
        int [][] weeks=new int [6][7];
        for(int i=0;i<6; i++){
            for(int j=start.get(Calendar.DAY_OF_WEEK)-1;j<7 && start.compareTo(end)<0;j++){
                weeks[i][j]=start.get(Calendar.DATE);
                start.add(Calendar.DAY_OF_MONTH, 1);
            }
        }
        myMonth.setWeeks(weeks);
        return myMonth;
    }

    public List<MyMonth> getList(int startYear,int startMonth,int endYear,int endMonth){
        List<MyMonth> monthList=new ArrayList<MyMonth>();
        Calendar start = new GregorianCalendar(startYear, startMonth - 1, 1);// 月份从0开始,按照习惯,应减1
        Calendar end = new GregorianCalendar(endYear, endMonth, 1);
        while(start.compareTo(end)<0){
            MyMonth m=getMyMonth(start.get(Calendar.YEAR),start.get(Calendar.MONTH)+1);
            monthList.add(m);//将每个月加入list
            start.add(Calendar.MONTH, 1);//下一个月
        }
        return monthList;
    }

    public void printMonth(int startYear,int startMonth,int endYear,int endMonth,int num){
        List<MyMonth> list=getList(startYear, startMonth, endYear, endMonth);
        int size=list.size();
        for(int i=0;i<size;i+=num){
            for(int j=0;j<num&&j<size-i;j++){//输出当前年月
                MyMonth mm=list.get(i+j);
                System.out.print(mm.getYear()+"年"+mm.getMonth()+"月\t\t\t\t\t\t\t");
            }
            System.out.println();
            for(int j=0;j<num&&j<size-i;j++){
                System.out.print("日\t一\t二\t三\t四\t五\t六\t\t");
            }
            System.out.println();
            for(int row=0;row<6;row++){
                for(int k=0;k<num && i+k<list.size();k++){
                    MyMonth m=list.get(k);
                    for(int col=0;col<7;col++){
                        int d=m.getWeeks()[row][col];
                        System.out.print(d==0?"\t":d+"\t");//数组中为0的数显示为制表符,否则显示数组内容
                        if(col==6){//相邻两个月之间多添加一个制表符,使输出结果更明朗
                            System.out.print("\t");
                        }
                    }
                }
                System.out.println();
            }
            System.out.println();
        }

    }

    public static void main(String args[]){
        Main main=new Main();
        main.printMonth(2016, 6, 2016, 7, 3);
    }
}

方法三

package com.yhan219.demo1;

import java.util.Calendar;
import java.util.GregorianCalendar;

public class Month {
    private int year;
    private int month;

    public Month(int year, int month) {
        super();
        this.year = year;
        this.month = month;
    }

    public String getLine(int line){
        StringBuffer sb=new StringBuffer();
        Calendar calendar=new GregorianCalendar(this.year,this.month-1,1);
        if(this.month==0){
            sb.append(this.year-1+"年"+12+"月\t\t\t\t\t\t\n");
        }else{
            sb.append(this.year+"年"+this.month+"月\t\t\t\t\t\t\n");
        }

        sb.append("日\t一\t二\t三\t四\t五\t六\t\n");
        int start=calendar.get(Calendar.DAY_OF_WEEK);
        int weekNum=calendar.getMaximum(Calendar.WEEK_OF_MONTH);
        int index=start-1;
        for(int j=0;j<start-1;j++){
            sb.append("\t");
        }
        for(int i=0;i<weekNum;i++){
            for(int j=0;j<7-index;j++){
                int today=calendar.get(Calendar.DATE);
                sb.append(today+"\t");
                if(calendar.get(Calendar.DATE)==calendar.getActualMaximum(Calendar.DAY_OF_MONTH)){
                    int n=calendar.get(Calendar.DAY_OF_WEEK);
                    if( calendar.get(Calendar.DAY_OF_WEEK)!=7){//如果月末刚好是周六,则不空
                        for(int k=0;k<7-n;k++){
                            sb.append("\t");//月末空格
                        }
                    }

                    for(int k=0;k<7-weekNum;k++){
                        sb.append("\n\t\t\t\t\t\t\t");//空行
                    }
                    break;
                }
                calendar.add(Calendar.DAY_OF_MONTH, 1);
            }
            sb.append("\n");
            index=0;
        }
        String [] str=sb.toString().split("\n");
        return str[line];
    }

}
package com.yhan219.demo1;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.List;

public class LineMonth {

    private List<Month> months=new ArrayList<>();

    public String getLine(int i){
        StringBuffer ret= new StringBuffer();
        for (Month month : months) {
            ret.append(month.getLine(i)+"\t");
        }
        return ret.toString();

    }

    public void setMonths(int startYear,int startMonth,int endYear,int endMonth){
        Month month;
        months.clear();
        Calendar start=new GregorianCalendar(startYear,startMonth,1);
        Calendar end=new GregorianCalendar(endYear,endMonth,1);
        while(start.compareTo(end)<=0){
            month=new Month(start.get(Calendar.YEAR),start.get(Calendar.MONTH));
            this.months.add(month);
            start.add(Calendar.MONTH, 1);
        }
    }

}
package com.yhan219.demo1;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.List;

public class MyCalander {

    private static MyCalander myCalander=null;

    private List<LineMonth> lineMonths=new ArrayList<>(); 

    public  String formart(){
        StringBuffer ret = new StringBuffer();
        // 构造lineMonth的集合
        for (LineMonth lineMonth : lineMonths) {
            for(int i=0;i<8;i++){
                ret.append(lineMonth.getLine(i)+"\n");
            }
            ret.append("\n");
        }
        return ret.toString();
    }


    private MyCalander(){}

    public static MyCalander getInit(int startYear,int startMonth,int endYear,int endMonth,int num){

        /*MyCalander calander = new MyCalander();*/
        if(myCalander==null){
            myCalander=new MyCalander();
        }
        myCalander.init(startYear,startMonth, endYear,endMonth, num);
        return myCalander;
    }

    public void init(int startYear,int startMonth,int endYear,int endMonth,int num){
        // 构造lineMonths
        LineMonth lineMonth=null;
        Calendar start=new GregorianCalendar(startYear,startMonth,1);
        Calendar end=new GregorianCalendar(endYear, endMonth, 1);
        int monthNum=0;
        if(startYear==endYear){
            monthNum=endMonth-startMonth+1;
        }else{
            monthNum=12*(endYear-startYear)-startMonth+endMonth+1;//跨年处理
        }
        int index=0;
        while(start.compareTo(end)<=0 && index<(monthNum-monthNum%num)){
            lineMonth=new LineMonth();
            int startY=start.get(Calendar.YEAR);
            int startM=start.get(Calendar.MONTH);
            int show=startM+num-1;
            lineMonth.setMonths(startY, startM, startY,show);
            lineMonths.add(lineMonth);
            start.add(Calendar.MONTH, num);
            index+=num;
        }
        if(index==(monthNum-monthNum%num)){//最后一行处理
            lineMonth=new LineMonth();
            lineMonth.setMonths(start.get(Calendar.YEAR), start.get(Calendar.MONTH), start.get(Calendar.YEAR), endMonth);
            lineMonths.add(lineMonth);
        }
    }

}
package com.yhan219.demo1;

import java.util.Scanner;

public class InputUtil {
    public static int [] input(){
        System.out.println("请输入两个日期和每行显示的日历个数(示例:2016 6 2017 2 3):");
        Scanner scanner=new Scanner(System.in);
        String in = scanner.nextLine();
        try{
            String [] inArr=in.split(" ");
            int [] input=new int[5];
            for(int i=0;i<5;i++){
                input[i]=Integer.parseInt(inArr[i]);
            }
            if(input[0]>input[2]||(input[0]==input[2])&&input[1]>input[3]||input[4]<=0){
                System.err.println("输入格式错误!");
                System.exit(0);
            }else{
                return input;
            }
        }catch(Exception e){
            System.err.println("输入格式错误!");
        }finally {
            scanner.close();
        }
        return null;
    }


}
package com.yhan219.demo1;

public class App {

    public static void main(String[] args) {
        //输入
        int [] input= InputUtil.input();
        // 格式化
        String formatStr =  MyCalander.getInit(input[0], input[1],input[2],input[3],input[4]).formart();
        //输出
        System.out.println(formatStr);
    }

}

结果截图如下,第一种设置了年月日,后面两种都是只设置了年月。

这里写图片描述

<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>
分享到:
评论

相关推荐

    java日历 java日历

    java日历,输入月份或直接显示当前月 标示当前日期

    java日历记事本源代码(多种实现)

    java日历记事本源代码(多种实现)java日历记事本源代码(多种实现)java日历记事本源代码(多种实现)java日历记事本源代码(多种实现)java日历记事本源代码(多种实现)java日历记事本源代码(多种实现)java日历...

    仿百度日历,横向日历

    【标题】:“仿百度日历,横向日历” 在IT领域,日历组件是许多应用程序不可或缺的部分,尤其在管理时间、计划任务或者查看日期事件时。"仿百度日历,横向日历"是一个专为满足这些需求而设计的开发项目。它的主要...

    java日历小程序(源代码)

    Java日历小程序是一款基于Swing库开发的桌面应用程序,它为用户提供了一个直观的方式来查看和管理日期。Swing是Java Standard Edition (Java SE)的一部分,是一个用于构建用户界面的图形工具包,提供了丰富的组件和...

    java日历系统(阴阳日历)

    在Java编程语言中,开发一个日历系统是一个挑战性的任务,尤其当涉及到中国的阴阳历法时。本项目“java日历系统(阴阳日历)”实现了这样的功能,它不仅提供了阳历日期,还包含了中国传统的阴历日期,并且具备24节气...

    Java 日历 小工具

    在Java编程语言中,日历(Calendar)是一个重要的类,用于处理日期和时间。这个"Java日历小工具"很可能是开发者为了方便用户查询任意日期而创建的一个实用程序。下面我们将详细探讨Java日历API以及如何利用它来构建...

    Java日历及备忘录

    Java日历及备忘录程序是一个实用的桌面应用程序,它模仿了Windows操作系统中的日历功能,并添加了备忘录管理特性。这个程序的核心是利用Java编程语言实现的,旨在帮助用户方便地查看日期并设置提醒,提高个人或工作...

    日历控件,横向显示日历

    在本案例中,我们关注的是一个特别的日历控件,它以横向的方式显示日期,同时支持单击和双击事件。这个控件的实现可能涉及到自定义组件的设计和事件处理机制。 首先,"GlCalenderLevel.dpk" 是一个Delphi项目包文件...

    java日历小程序

    Java日历小程序是一种基于AWT(Abstract Window Toolkit)和SWING库开发的用户界面应用程序,主要用于展示日期并可能提供一些与日历相关的功能,如查看、添加和管理事件。这两个库是Java GUI(图形用户界面)编程的...

    java日历各种写法

    总之,Java的日历API提供了一整套工具来处理日期和时间,无论是在计算日期间隔、格式化输出,还是进行日期比较,都提供了足够的灵活性和控制力。熟练掌握这些用法,能有效提高Java程序在日期和时间处理上的效率和...

    java日历有界面

    Java日历程序是一种基于Java编程语言开发的应用,它提供了用户友好的界面,使得用户能够查看日期、安排日程以及查看黄历。这个程序的核心功能包括日程提醒、黄历显示、月份翻页以及年月组合的日历视图。在描述中提到...

    Java输出月份日历

    Java输出月份日历知识点详细说明: 1. Java基础:Java是一种广泛使用的面向对象编程语言,具有跨平台的特性。在本例中,Java的核心类如Calendar、Scanner和SimpleDateFormat被用于实现日历功能。对于初学者来说,...

    java日历源码 java日历

    Java日历源码是Java编程中的一个重要组成部分,它涉及到日期和时间的处理,这对于任何软件系统来说都是必不可少的功能。在Java中,`java.util.Calendar`类是管理日期和时间的基础类,而`java.time`包在Java 8及更高...

    java日历记事本程序

    【标题】"java日历记事本程序"是一款基于Java编程语言开发的应用程序,它集成了日历、记事本、课程表以及计时提醒等多种功能。这个项目使用了NetBeans IDE进行开发,使得代码组织和工程管理更为便捷。NetBeans是Java...

    java 日历控件 源码

    Java日历控件是Swing库中的一个组件,它允许开发者在GUI应用程序中添加日期选择功能。Swing是Java的标准GUI库,提供了丰富的组件集合,包括按钮、文本框、滚动面板以及我们关注的日历控件。这个源码可能是实现了一个...

    java日历 时钟。

    这个“java日历 时钟”项目很可能是利用`Calendar`类来实现一个功能性的日历应用程序,用户可以查看日期、设置提醒等。下面将详细介绍`Calendar`类以及如何使用它来构建日历和时钟功能。 首先,`Calendar` 类是抽象...

    java日历核心代码

    ### Java日历核心代码知识点解析 #### 一、程序概览 这段Java代码实现了一个简易的日历系统,能够根据用户输入的年份和月份显示该月份的日历。它通过计算从1990年1月1日至指定日期的总天数来确定星期几,并据此打印...

    java日历与时钟

    在Java编程语言中,日历(Calendar)和时钟(Clock)是处理日期和时间的重要工具。本主题将深入探讨这两个概念以及如何在Java中进行模拟。Java的日期和时间API经历了多次演变,从早期的`java.util.Date`和`java.util...

    日历备忘录Java源码

    在本项目中,"日历备忘录Java源码" 提供了一套完整的日历应用程序的源代码,主要由四个核心文件组成:NotePad.java、CalendarPad.java、Month.java 和 Year.java。这些文件分别代表了备忘录、日历、月份和年份的功能...

Global site tag (gtag.js) - Google Analytics