package lyj.next.second;
import java.io.Serializable;
import java.util.Calendar;
public class NextSecond {
private static final int BIGMONTH = 0X00001F;
private static final int SMALLMONTH = 0X00001E;
private static final int BIGFEBRUAY = 0X00001D;
private static final int SMALLFEBRUAY = 0X00001C;
/**
* 获取指定日期的下一秒
*
* @param date
* @return
* @throws Exception
*/
public static String nextSeconds(Date date) throws Exception {
if (!Date.checkUseFul(date)) {
throw new Exception("日期不合法");
}
return Date.nextDateInOneSecond(date);
}
// 主程序入口
public static void main(String[] args) throws Exception {
Date dt = new Date(2012, 10, 31, 23, 59, 59);
System.out.println(nextSeconds(dt));
}
// 日期内
static class Date implements Serializable {
private static final long serialVersionUID = -8876583691388432561L;
int year, month, day, hour, minute, second;
private static boolean needAddMinute = Boolean.FALSE;// 是否需要累加月
private static boolean needAddHour = Boolean.FALSE;// 是否需要累加小时
private static boolean needAddDay = Boolean.FALSE;// 是否需要累加天数
private static boolean needAddMonth = Boolean.FALSE;// 是否需要累加月数
private static boolean needAddYear = Boolean.FALSE;// 是否需要累加年份
private Date(int year, int month, int day, int hour, int minute,
int second) {
this.year = year;
this.month = month;
this.day = day;
this.hour = hour;
this.minute = minute;
this.second = second;
}
private Date(Calendar cand) {
this.year = cand.get(Calendar.YEAR);
this.month = cand.get(Calendar.MONTH);
this.day = cand.get(Calendar.DATE);
this.hour = cand.get(Calendar.HOUR);
this.minute = cand.get(Calendar.MINUTE);
this.second = cand.get(Calendar.SECOND);
}
private int getMonth() {
return month;
}
private int getYear() {
return year;
}
private int getDay() {
return day;
}
private int getHour() {
return hour;
}
private int getMinute() {
return minute;
}
private int getSecond() {
return second;
}
private void setYear(int year) {
this.year = year;
}
private void setMonth(int month) {
this.month = month;
}
private void setDay(int day) {
this.day = day;
}
private void setHour(int hour) {
this.hour = hour;
}
private void setMinute(int minute) {
this.minute = minute;
}
private void setSecond(int second) {
this.second = second;
}
/**
* 检测日期是否为有效日期 默认有效返回yes无效返回no
*
* @param date
* @return
*/
private static boolean checkUseFul(Date date) {
boolean[] useful = new boolean[6];
useful[0] = date.year >= 1;// 年份必须从整数1开始
useful[1] = date.month >= 1 && date.month <= 12;// 月份控制在1到12月之间
useful[2] = date.day >= 1 && date.day <= days(date);// 天数必须<=这个月的最大日期
useful[3] = date.hour >= 1 && date.hour <= 23;// 小时为24小时制
useful[4] = date.minute >= 1 && date.minute <= 59;
useful[5] = date.second >= 0 && date.second <= 59;
for (boolean b : useful) {
if (!b)
return false;
}
return true;
}
/**
* 判断指定日期的年份是否属于润年
*
* @param date
* @return
*/
private static boolean isLeapYear(final Date date) {
final int year = date.getMonth();
return ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0));
}
/**
*
* @param date
* @return 指定日期的这个月有多少天
*/
private static int days(final Date date) {
int daycount;
final int month = date.getMonth();
switch (month) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
return BIGMONTH;
case 2:
daycount = (isLeapYear(date)) ? BIGFEBRUAY : SMALLFEBRUAY;
return daycount;
default:
return SMALLMONTH;
}
}
/**
* 判断当前秒是否大于59如果是则分要加1
*
* @return
*/
private static void nextSecond(final Date date) {
int second = date.getSecond();
date.setSecond((second == 59) ? 00 : second + 1);
needAddMinute = (second == 59);
}
/**
* 判断当前分是否为59如果是则小时要加1
*
* @return
*/
private static void nextMinute(final Date date) {
int minute = date.getMinute();
minute = needAddMinute ? minute + 1 : minute;
date.setMinute(minute == 60 ? 00 : minute);
needAddHour = (minute == 60);
}
/**
* 判断当前小时是否到了24如果是则天数要加1
*
* @return
*/
private static void nextHour(final Date date) {
int hour = date.getHour();
hour = needAddHour ? hour + 1 : hour;
date.setHour(hour == 24 ? 00 : hour);
needAddDay = (hour == 24);
}
/**
* 判断当前天数是否到了当月的最后一天如果是则月数要加1
*
* @return
*/
private static void nextDays(final Date date) {
final int daycount = days(date);
int day = date.getDay();
day = needAddDay ? day + 1 : day;
date.setDay(day == daycount + 1 ? 1 : day);
needAddMonth = (day == daycount + 1);
}
/**
* 判断当前月份是否到了12月如果是则年份要加1
*
* @return
*/
private static void nextMonth(final Date date) {
int month = date.getMonth();
month = needAddMonth ? month + 1 : month;
date.setMonth(month == 13 ? 1 : month);
needAddYear = (month == 13);
}
private static void nextYear(final Date date) {
int year = date.getYear();
year = needAddYear ? year + 1 : year;
date.setYear(year);
}
static String toString(final Date date) {
String string = date.getYear() + "年" + date.getMonth() + "月"
+ date.getDay();
string += "日 " + date.getHour() + "时" + date.getMinute() + "分"
+ date.getSecond() + "秒";
return string;
}
static String nextDateInOneSecond(final Date date) {
String currDate = "当前日期为:" + toString(date) + "\n";
nextSecond(date);
nextMinute(date);
nextHour(date);
nextDays(date);
nextMonth(date);
nextYear(date);
return currDate + "下一秒为:" + toString(date);
}
}
}