1 构造日期
1.1 构造方法
private int year;
private int month;
private int day;
public Date(Date date) {
this.year = date.year;
this.month = date.month;
this.day = date.day;
}
public Date(int year, int month, int day) {
if (!checkYear(year)) {
throw new RuntimeException("year必须在[1000,3000]内,year= " + year);
}
if (!checkMonth(month)) {
throw new RuntimeException("month必须在[1,12]内,month = " + month);
}
if (!checkDay(year, month, day)) {
throw new RuntimeException("day必须符合范围");
}
this.year = year;
this.month = month;
this.day = day;
}
1.2 只读权限
public int getYear() {
return year;
}
public int getMonth() {
return month;
}
public int getDay() {
return day;
}
1.3 检查合法性
private boolean checkDay(int year, int month, int day) {
if (month != 2) {
int i = month - 1;
return day >= 1 && day <= DAY_OF_MONTH[i];
}
if (isLeapYear(year)) {
return day >= 1 && day <= 29;
}
return day >= 1 && day <= 28;
}
private boolean checkMonth(int month) {
return month >= 1 && month <= 12;
}
private boolean checkYear(int year) {
return year >= 1000 && year <= 3000;
}
1.4 判断闰年
private static boolean isLeapYear(int year) {
if (year % 400 == 0) {
return true;
}
return year % 4 == 0 && year % 100 != 0;
}
1.5 根据月份取边界
private static int 根据月取边界(int year, int month) {
if (month == 2) {
return isLeapYear(year) ? 29 : 28;
} else {
int m = month - 1;
return DAY_OF_MONTH[m];
}
}
private static final int[] DAY_OF_MONTH = {
31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
};
1.6 实现向前一天、向后一天操作
public void 往前一天() {
day--;
if (day >= 1) {
return;
}
month--;
if (month == 0) {
year--;
month = 12;
}
day = 根据月取边界(year, month);
}
public void 往后一天() {
day++;
int dayBound = 根据月取边界(year, month);
if (day <= dayBound) {
return;
}
month++;
day = 1;
if (month <= 12) {
return;
}
year++;
month = 1;
}
1.7 返回格式为字符串类型,具体为2021-12-08
public String toString() {
return String.format("%04d-%02d-%02d", year, month, day);
}
1.8 实现计算两个日期相差的天数
public static int 相差天数(Date d1, Date d2) {
boolean sign = true;
//Date tmp = new Date(d1.getYear(),d1.getMonth(),d1.getDay());
if(compare(d1,d2) > 0){
Date d = d1;
d1 = d2;
d2 = d;
sign = false;
}
Date tmp = new Date(d1);
int count = 0;
while (!equals(tmp, d2)) {
tmp.往后一天();
count++;
}
return sign ? count: -count;
}
private static boolean equals(Date d1, Date d2) {
return d1.getYear() == d2.getYear()
&& d1.getMonth() == d2.getMonth()
&& d1.getDay() == d2.getDay();
}
private static int compare(Date d1,Date d2){
if(d1.getYear() != d2.getYear()){
return d1.getYear() - d2.getYear();
}
if(d1.getMonth() !=d2.getMonth()){
return d1.getMonth() - d2.getMonth();
}
return d1.getDay() - d2.getDay();
}
2 构造时间
2.1 构造方法
private int minute;
private int hour;
private int second;
public Time(Time time){
this.hour = time.hour;
this.minute = time.minute;
this.second = time.second;
}
public Time(int hour, int minute, int second) {
this.hour = hour;
this.minute = minute;
this.second = second;
}
2.2 实现下一秒的操作
public boolean 下一秒() {
second++;
if (second < 60) {
return false;
}
minute++;
second = 0;
if (minute < 60) {
return false;
}
hour++;
minute = 0;
if (hour < 24) {
return false;
}
hour = 0;
return true;
}
3 将时间和日期整体操作
3.1 构造方法
private Date date;
private Time time;
public DateTime(int year,int month,int day,int hour,int minute,int second){
date = new Date(year,month,day);
time = new Time(hour,minute,second);
}
public DateTime(){
}
3.2 特殊处理
public void 下一秒(){
if(time.下一秒()){
date.往后一天();
}
}
public String toString(){
return date.toString()+ " "+ time.toString();
}
以上是构造日期时间的部分操作,仅供参考。之后将讲述对日期时间类的拷贝方式,详见Java基础之深浅拷贝(DateTime)。
本文含有隐藏内容,请 开通VIP 后查看