- 浏览: 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);
}
}
相关推荐
java日历,输入月份或直接显示当前月 标示当前日期
java日历记事本源代码(多种实现)java日历记事本源代码(多种实现)java日历记事本源代码(多种实现)java日历记事本源代码(多种实现)java日历记事本源代码(多种实现)java日历记事本源代码(多种实现)java日历...
【标题】:“仿百度日历,横向日历” 在IT领域,日历组件是许多应用程序不可或缺的部分,尤其在管理时间、计划任务或者查看日期事件时。"仿百度日历,横向日历"是一个专为满足这些需求而设计的开发项目。它的主要...
Java日历小程序是一款基于Swing库开发的桌面应用程序,它为用户提供了一个直观的方式来查看和管理日期。Swing是Java Standard Edition (Java SE)的一部分,是一个用于构建用户界面的图形工具包,提供了丰富的组件和...
在Java编程语言中,开发一个日历系统是一个挑战性的任务,尤其当涉及到中国的阴阳历法时。本项目“java日历系统(阴阳日历)”实现了这样的功能,它不仅提供了阳历日期,还包含了中国传统的阴历日期,并且具备24节气...
在Java编程语言中,日历(Calendar)是一个重要的类,用于处理日期和时间。这个"Java日历小工具"很可能是开发者为了方便用户查询任意日期而创建的一个实用程序。下面我们将详细探讨Java日历API以及如何利用它来构建...
Java日历及备忘录程序是一个实用的桌面应用程序,它模仿了Windows操作系统中的日历功能,并添加了备忘录管理特性。这个程序的核心是利用Java编程语言实现的,旨在帮助用户方便地查看日期并设置提醒,提高个人或工作...
在本案例中,我们关注的是一个特别的日历控件,它以横向的方式显示日期,同时支持单击和双击事件。这个控件的实现可能涉及到自定义组件的设计和事件处理机制。 首先,"GlCalenderLevel.dpk" 是一个Delphi项目包文件...
Java日历小程序是一种基于AWT(Abstract Window Toolkit)和SWING库开发的用户界面应用程序,主要用于展示日期并可能提供一些与日历相关的功能,如查看、添加和管理事件。这两个库是Java GUI(图形用户界面)编程的...
总之,Java的日历API提供了一整套工具来处理日期和时间,无论是在计算日期间隔、格式化输出,还是进行日期比较,都提供了足够的灵活性和控制力。熟练掌握这些用法,能有效提高Java程序在日期和时间处理上的效率和...
Java日历程序是一种基于Java编程语言开发的应用,它提供了用户友好的界面,使得用户能够查看日期、安排日程以及查看黄历。这个程序的核心功能包括日程提醒、黄历显示、月份翻页以及年月组合的日历视图。在描述中提到...
Java输出月份日历知识点详细说明: 1. Java基础:Java是一种广泛使用的面向对象编程语言,具有跨平台的特性。在本例中,Java的核心类如Calendar、Scanner和SimpleDateFormat被用于实现日历功能。对于初学者来说,...
Java日历源码是Java编程中的一个重要组成部分,它涉及到日期和时间的处理,这对于任何软件系统来说都是必不可少的功能。在Java中,`java.util.Calendar`类是管理日期和时间的基础类,而`java.time`包在Java 8及更高...
【标题】"java日历记事本程序"是一款基于Java编程语言开发的应用程序,它集成了日历、记事本、课程表以及计时提醒等多种功能。这个项目使用了NetBeans IDE进行开发,使得代码组织和工程管理更为便捷。NetBeans是Java...
Java日历控件是Swing库中的一个组件,它允许开发者在GUI应用程序中添加日期选择功能。Swing是Java的标准GUI库,提供了丰富的组件集合,包括按钮、文本框、滚动面板以及我们关注的日历控件。这个源码可能是实现了一个...
这个“java日历 时钟”项目很可能是利用`Calendar`类来实现一个功能性的日历应用程序,用户可以查看日期、设置提醒等。下面将详细介绍`Calendar`类以及如何使用它来构建日历和时钟功能。 首先,`Calendar` 类是抽象...
### Java日历核心代码知识点解析 #### 一、程序概览 这段Java代码实现了一个简易的日历系统,能够根据用户输入的年份和月份显示该月份的日历。它通过计算从1990年1月1日至指定日期的总天数来确定星期几,并据此打印...
在Java编程语言中,日历(Calendar)和时钟(Clock)是处理日期和时间的重要工具。本主题将深入探讨这两个概念以及如何在Java中进行模拟。Java的日期和时间API经历了多次演变,从早期的`java.util.Date`和`java.util...
在本项目中,"日历备忘录Java源码" 提供了一套完整的日历应用程序的源代码,主要由四个核心文件组成:NotePad.java、CalendarPad.java、Month.java 和 Year.java。这些文件分别代表了备忘录、日历、月份和年份的功能...