package com.pratise;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.text.StyledEditorKit.BoldAction;
/**
* @author Luffy
* @date 2017/09/01
* 根据日期判断当月的最后一天日期
*
*公历闰年的精确计算方法(按一回归年365天5小时48分45.5秒)
*①普通年能被4整除且不能被100整除的为闰年.(如2004年就是闰年,1901年不是闰年)
*②世纪年能被400整除的是闰年.(如2000年是闰年,1900年不是闰年)
*
*@ mod 2017/09/03 输入规范(输入日期的有效性检验)
*/
public class DateJudge {
public static void main(String[] args) {
getMonthLastDate1(); //第一种方法
// getMonthLastDate2(); //第二种方法
// getMonthLastDate3(); //第三种方法
}
/**
* 第一种获值方法(以平润年的定义解析判断)
*
*/
private static void getMonthLastDate1() {
Scanner sc = new Scanner(System.in);
System.out.println("日期格式为(YYYY-MM-DD)请输入:");
String res = sc.nextLine();
String ym = res.substring(0, 8);//取"年-月-"
String year = res.substring(0,4);//取年份
String month = res.substring(5, 7);//取月份
String day = res.substring(8, 10);
int dayInt = Integer.valueOf(day);//号.数字化
//输入格式判断
Boolean b = regDateFormat(res);
if(b) {
//一个月30天的月份
if(month.equals("04") || month.equals("07") || month.equals("09") || month.equals("11")) {
if (dayInt>0 && dayInt<=30) {
System.out.println("这月的最后一天日期为:"+ym+"30");
}else {
System.out.println("当前输入日期不存在!");
}
}//2月份(28或29天)
else if(month.equals("02")) {
//判断平润年
int iyear = Integer.parseInt(year);
if(((iyear%4==0&&iyear%100!=0)||iyear%400==0)){
if(dayInt>0 && dayInt<=29) {
System.out.println("这月的最后一天日期为:"+ym+"29");
}else {
System.out.println("当前输入日期不存在!");
}
}else if(!((iyear%4==0&&iyear%100!=0)||iyear%400==0)) {
if(dayInt>0 && dayInt<=28) {
System.out.println(year+"年是平年,这月的最后一天日期为:"+ym+"28");
}else {
System.out.println("当前输入日期不存在!");
}
}
}//一个月31天的月份
else {
if(dayInt>0 && dayInt<=31) {
System.out.println("这月的最后一天日期为:"+ym+"31");
}else {
System.out.println("当前输入日期不存在!");
}
}
}
else {
System.out.println("输入的日期格式错误");
}
}
/**
* 第二种获值方法(获取日历函数的当月最大天数)
*
*/
private static void getMonthLastDate2() {
Scanner sc = new Scanner(System.in);
System.out.println("日期格式为(YYYY-MM-DD)请输入:");
String res = sc.nextLine();
//输入格式判断
Boolean b = regDateFormat(res);
if(b) {
int year=Integer.parseInt(res.substring(0, 4));
int month=Integer.parseInt(res.substring(5, 7));
int day=Integer.parseInt(res.substring(8, 10));
Date date = new Date();
date.setYear(year-1900);
date.setMonth(month-1);
date.setDate(day);
Calendar calendar = Calendar.getInstance(); //获得此类型的一个通用的对象
calendar.setTime(date); //设值时间为输入的所需值
String ym = res.substring(0, 8);//取"年-月-"
int lastDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH); //返回指定日历字段可能拥有的最大值
//日期输入有效性检验
int getInputFormat = Integer.valueOf(res.substring(8, 10).replace("-", ""));//输入日期的天数
if(getInputFormat>0 && getInputFormat<=lastDay) {
System.out.println("该月的最后一天日期为:"+ym+String.valueOf(lastDay));
}else {
System.out.println("当前输入日期不存在!");
}
}else {
System.out.println("输入的日期格式错误");
}
}
/**
* 第三种获值方法(下月1号减一天)
*
*/
private static void getMonthLastDate3() {
Scanner sc = new Scanner(System.in);
System.out.println("日期格式为(YYYY-MM-DD)请输入:");
String res = sc.nextLine();
//输入格式判断
Boolean b = regDateFormat(res);
if(b) {
int year=Integer.parseInt(res.substring(0, 4));
int month=Integer.parseInt(res.substring(5, 7));
int day=Integer.parseInt(res.substring(8, 10));
Date date = new Date();
date.setYear(year-1900);
date.setMonth(month-1);
date.setDate(day);
Calendar calendar = Calendar.getInstance(); //获得此类型的一个通用的对象
calendar.setTime(date); //设值时间为输入的所需值
// 设置Calendar月份数为下一个月
calendar.set(Calendar.MONTH, calendar.get(Calendar.MONTH) + 1);
// 设置Calendar日期为下一个月一号
calendar.set(Calendar.DATE, 1);
// 设置Calendar日期减一,为本月末
calendar.add(Calendar.DATE, -1);
DateFormat format = new SimpleDateFormat("yyyy-MM-dd");
int lastDay = Integer.valueOf(String.valueOf(format.format(calendar.getTime())).substring(8, 10));
if(day>0 && day<=lastDay) {
System.out.println("该月的最后一天日期为:"+format.format(calendar.getTime()));
}else {
System.out.println("当前输入日期不存在!");
}
}else {
System.out.println("输入的日期格式错误");
}
}
/**
* 输入格式检验:YYYY-MM-DD(年份4位数字,月份01-12,天数00-39,此处天数无需细化控制,于代码逻辑中判断处理)
*/
public static Boolean regDateFormat(String res) {
String reg="((^\\d{4}-0\\d{1}-[0-3]{1}\\d{1})|(^\\d{4}-1[0-2]{1}-[0-3]{1}\\d{1}))$";
Pattern p = Pattern.compile(reg);
Matcher m = p.matcher(res);
boolean b = true;
b=m.matches();
return b;
}
}