/**
* 日期类
* 根据需求列出功能列表
* 1.传 年、月、日 构造日期类
* 2.在当前日期上增加多少天
* 3.在当前日期上减少多少天
* 4.可以返回字符串 String 的方法 "2019-5-30"
* 5.加一些限制 : 年支持的范围 [1900, 2100]
* 6.如果给定两个日期,计算两个日期之间相差多少天
* 设计属性
* 1.年、月、日
*/
public class Date {
private int year;
private int month;
private int day;
//构造方法
public Date(int year, int month, int day) {
//至少做基本的参数检查
if(year < 1900 || year > 2100){
//最好抛出异常
System.out.println("年不合法" + year);
return;
}
if(month < 1 || month >12) {
System.out.println("月不合法" + month);
return;
}
if(day < 1 || day > getDayOfMonth(year,month)) {
System.out.println("日不合法" + day);
return;
}
//涉及 Name Shadow
this.year = year;
this.month = month;
this.day = day;
}
private Date(Date other) {
this(other.year, other.month, other.day);
}
//支持的方法
public void add(int days) { //这里的 days 如果写成day ,那么使用属性day要用 this
//days必须是正数
if(day < 0){
System.out.println("days不合法" + days);
return;
}
day += days;
while(day > getDayOfMonth(year,month)) {
day -= getDayOfMonth(year,month);
month++;
if(month > 12){
month = 1;
year++;
}
}
}
public void sub(int days) {
//days必须是正数
if(day < 0){
System.out.println("days不合法" + days);
return;
}
day -= days;
while (day < 1) {
month--;
if(month <1) {
month = 12;
year--;
}
day += getDayOfMonth(year,month);
}
}
public String toString() {
return String.format("%04d-%02d-%02d", year, month, day);
}
//返回d1 和d2 之间相差的天数,
//规定 d1 > d2
public static int differ(Date d1, Date d2) {
if(!(isGreatThan(d1, d2))) {
System.out.println("d1 必须大于 d2");
return -1;
}
int days = 0;
Date tmp = new Date(d1);
while (isGreatThan(tmp, d2)) {
tmp.sub(1);
days++;
}
return days;
}
//内部使用的方法,private
//不会被修改的常量 DAY_OF_MONTH
private static final int[] DAY_OF_MONTH = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
private static int getDayOfMonth(int year, int month) {
int days = DAY_OF_MONTH[month - 1];
if (month == 2 && isLeapYear(year)) {
days = 29;
}
return days;
}
private static boolean isLeapYear(int year) {
if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
return true;
}
return false;
}
private static boolean isGreatThan(Date d1, Date d2) {
if(d1.year > d2.year) {
return true;
}
if(d1.year == d2.year && d1.month > d2.month) {
return true;
}
if(d1.year == d2.year && d1.month == d2.month && d1.day > d2.day) {
return true;
}
return false;
}
public static void main(String[] args) {
Date date = new Date(2019,5,20);
System.out.println(date.toString());
date.add(10);
System.out.println(date.toString());
date.add(10);
System.out.println(date.toString());
date.sub(22);
System.out.println(date.toString());
Date today = new Date(2019, 5, 20);
Date intern = new Date(2019, 12, 22);
System.out.printf("距离12月1日还有 %d 天%n", Date.differ(intern,today));
}
}
Java实现一个Date类
猜你喜欢
转载自blog.csdn.net/qq_44057443/article/details/90697295
今日推荐
周排行