日期类,根据日期计算是本年度的第几天,第几周,星期几

要求:根据日期求天数,周,星期几

思路:试试不用java封装好的方法写一个日期类,属性:年、月、日;首先判断日期是否合法,

第一功能计算天数:求当月前一个月与第一月相差的天数,在加上当前月到几号的天数;

第二个功能计算第几周:用第一个求得的天数除7就得到了该日期是本年度的第几周;

第三个功能计算星期几:首先我们要找到一个坐标,以这个坐标为基准来求星期几,计算机世界里是以1970年1月1号为基准的,然而我们得知70年1月1号是星期四;这是后我们创建一个星期的二维数组,下标为0就为星期四,下标6为星期三;然后我们求出日期距离1970年1月1号的天数在对7取余,所得余数进行-1(-1是因为这个数要代表下标),然后用这个下标去找数组中对应星期几,这样就可以求出是周几了。(代码如下)

public class MyDate {

	private int year;
	private int month;
	private int day;

	public MyDate() {
		super();
	}

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

	public int getYear() {
		return year;
	}

	public int getMonth() {
		return month;
	}

	public int getDay() {
		return day;
	}

	/**
	 * 本年度第几天
	 * 
	 * @return
	 */
	public static int day(MyDate date) {

		int years = date.getYear();
		int months = date.getMonth();
		int days = date.getDay();

		if (!feifapanduan(years, months, days)) {
			System.out.println("输入年份不合法!");
			return -1;
		}

		/**
		 * 计算日期在本年度的天数
		 */
		int sum = 0;
		for (int i = 1; i < months; i++) {
			sum += ym(years, i);
		}
		// 返回本年度多少天
		return sum + days;

	}

	/**
	 * 第几周
	 */
	public static void weeks(MyDate date) {

		int sum = day(date);

		int weeks = sum / 7;
		if (sum % 7 == 0) {
			System.out.println("第" + weeks + "周");
		} else {
			int week = weeks + 1;
			System.out.println("第" + week + "周");
		}
	}

	/**
	 * 星期几
	 */
	public static void weekxingqi(MyDate date) {

		String[] wekesday = new String[] { "星期四", "星期五", "星期六", "星期天", "星期一",
				"星期二", "星期三" };
		int year = date.year;
		int sum = day(date);
		/**
		 * 计算日期距70年的天数 满足条件 6+n<=day<=6+7n
		 * 
		 */
		int yearsum = 0;
		for (int a = 1970; a < year; a++) {
			if (a % 4 == 0 && a % 100 != 0 || a % 400 == 0) {
				yearsum += 366;

			} else {
				yearsum += 365;

			}
		}
		// 定义距70年的天数
		int ymsum = yearsum + sum;

		// 天数对7取余
		int weekday = ymsum % 7;

		System.out.println("相距70年" + ymsum + "    " + "余数" + weekday);
		/**
		 * 循环星期数据根据余数找出星期几
		 */
		for (int i = 0; i < wekesday.length; i++) {
			if (i == weekday - 1) {
				System.out.println(wekesday[i]);
			}
		}
	}

	/**
	 * 判断是否闰年,选择月份
	 * 
	 * @param years
	 * @param month
	 * @return
	 */
	public static int ym(int years, int month) {

		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 (years % 4 == 0 && years % 100 != 0 || years % 400 == 0) {
				days = 29;
			} else {
				days = 28;
			}
			break;
		default:

			break;
		}
		return days;

	}

	/**
	 * 判断输入日期是否合法
	 * 
	 * @param year
	 * @param month
	 * @param ri
	 * @return
	 */
	public static boolean feifapanduan(int year, int month, int ri) {
		if (year != 0 && month > 0 && month < 13 && ri < ym(year, month)) {
			return true;
		}
		return false;
	}
}

测试代码:

@SuppressWarnings("static-access")
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		MyDate date = new MyDate(2018, 2, 26);
		System.out.println("本年度第" + date.day(date) + "天");
		date.weeks(date);
		date.weekxingqi(date);
	}


运行结果:


OK,写出来分享,代码可直接运行

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值