题目 1493: 蓝桥杯算法提高VIP-任意年月日历输出

题目描述

已知2007年1月1日为星期一。
设计一函数按照下述格式打印2007年以后(含)某年某月的日历,2007年以前的拒绝打印。
为完成此函数,设计必要的辅助函数可能也是必要的。其中输入为年分和月份。

注意:短线“-”个数要与题目中一致,否则系统会判为错误。
 

输入

年月和月份

输出

样例输入

2010 9 

样例输出

---------------------
 Su Mo Tu We Th Fr Sa
---------------------
           1  2  3  4
  5  6  7  8  9 10 11
 12 13 14 15 16 17 18
 19 20 21 22 23 24 25
 26 27 28 29 30
---------------------
package parctice;
//提交前要把导包写入
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Scanner;

public class ph1493 {
	public static void main(String[] args) {
			Scanner sc=new Scanner(System.in);
	        int year = sc.nextInt();
	        if (year < 2007)
	            return;
	        int month = sc.nextInt();
	        System.out.println("---------------------");
	        System.out.println(" Su Mo Tu We Th Fr Sa");
	        System.out.println("---------------------");
	        int i;
	        GregorianCalendar cal = new GregorianCalendar(year, month - 1, 1);// 对年份,月份,以及第一天来创建对象
	        int totalDays = cal.getActualMaximum(Calendar.DAY_OF_MONTH);// 获取该月份的天数
	        int startDay = cal.get(Calendar.DAY_OF_WEEK) - 1;// 获取该月的第一天是星期几
	        for (i = 0; i < startDay; i++)
	            System.out.print("   ");// 输出第一天前的空格
	        for (int day = 1; day <= totalDays; day++) {
	            if (day <= 9) { // 用于输出控制
	                System.out.print("  " + day);// 依次输出每一天
	            } else {
	                System.out.print(" " + day);
	            }
	            i++;
	            if (day < totalDays) {
	                if (i == 7) { // 每个星期输完换行
	                    System.out.println();
	                    i = 0;
	                }
	            } else {
	                System.out.println();
	            }
	        }
	        System.out.println("---------------------");
	 }
}

 

知识补充

GregorianCalendar类

Calendar类实现了公历日历,GregorianCalendar是Calendar类的一个具体实现。

Calendar 的getInstance()方法返回一个默认用当前的语言环境和时区初始化的GregorianCalendar对象。GregorianCalendar定义了两个字段:AD和BC。这是代表公历定义的两个时代。

下面列出GregorianCalendar对象的几个构造方法:

序号构造函数和说明
1GregorianCalendar()
在具有默认语言环境的默认时区内使用当前时间构造一个默认的 GregorianCalendar。
2GregorianCalendar(int year, int month, int date)
在具有默认语言环境的默认时区内构造一个带有给定日期设置的 GregorianCalendar
3GregorianCalendar(int year, int month, int date, int hour, int minute)
为具有默认语言环境的默认时区构造一个具有给定日期和时间设置的 GregorianCalendar。
4GregorianCalendar(int year, int month, int date, int hour, int minute, int second)
  为具有默认语言环境的默认时区构造一个具有给定日期和时间设置的 GregorianCalendar。
5GregorianCalendar(Locale aLocale)
在具有给定语言环境的默认时区内构造一个基于当前时间的 GregorianCalendar。
6GregorianCalendar(TimeZone zone)
在具有默认语言环境的给定时区内构造一个基于当前时间的 GregorianCalendar。
7GregorianCalendar(TimeZone zone, Locale aLocale)
 在具有给定语言环境的给定时区内构造一个基于当前时间的 GregorianCalendar。

 

int getActualMaximum(int field)
返回当前日期,给定字段的最大值

 

getActualMaximum(Calendar.DAY_OF_MONTH);返回一个月的天数 

 get(Calendar.DAY_OF_WEEK);返回的是一个月的第一天

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值