问题描述
小明正在整理一批历史文献。这些历史文献中出现了很多日期。
小明知道这些日期都在 1960 年 1 月 1 日 至 2059 年 12 月 31 日。
令小明头疼的是,这些日期采用的格式非常不统一,有采用年/月/日的,有采用月/日/年的,还有采用日/月/年的。
更加麻烦的是,年份也都省略了前两位,使得文献上的一个日期,存在很多可能的日期与其对应。
比如 02/03/04,可能是 2002 年 03 月 04 日、2004 年 02 月 03 日 或 2004 年 03 月 02 日。
给出一个文献上的日期,你能帮助小明判断有哪些可能的日期对其对应吗?
输入格式
一个日期,格式是 AA/BB/CC。 (0 ≤ A, B, C ≤ 9)
输出格式
输出若干个不相同的日期,每个日期一行,格式是 yyyy-MM-dd,多个日期按从早到晚排列。
样例输入
02/03/04
样例输出
2002-03-04
2004-02-03
2004-03-02
import sun.reflect.generics.tree.Tree;
/**
* 问题描述
* 小明正在整理一批历史文献。这些历史文献中出现了很多日期。
*
* 小明知道这些日期都在 1960 年 1 月 1 日 至 2059 年 12 月 31 日。
*
* 令小明头疼的是,这些日期采用的格式非常不统一,有采用年/月/日的,有采用月/日/年的,还有采用日/月/年的。
*
* 更加麻烦的是,年份也都省略了前两位,使得文献上的一个日期,存在很多可能的日期与其对应。
*
*
*
* 给出一个文献上的日期,你能帮助小明判断有哪些可能的日期对其对应吗?
*
* 输入格式
* 一个日期,格式是 AA/BB/CC。 (0 ≤ A, B, C ≤ 9)
*
* 输出格式
* 输出若干个不相同的日期,每个日期一行,格式是 yyyy-MM-dd,多个日期按从早到晚排列。
*
* 样例输入
* 02/03/04
*
* 样例输出
* 2002-03-04
* 2004-02-03
* 2004-03-02
*/
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String s = scanner.nextLine();
//将String型数据变为int,- '0' 即可
int year = (s.charAt(0) - '0') * 10 + (s.charAt(1) - '0');
int month = (s.charAt(3) - '0') * 10 + (s.charAt(4) - '0');
int day = (s.charAt(6) - '0') * 10 + (s.charAt(7) - '0');
// 有采用年/月/日的,有采用月/日/年的,还有采用日/月/年
String case1 = f(year,month,day);
String case2 = f(day,year,month);
String case3 = f(day,month,year);
//加入TreeSet实现自动排序
Set<String> set = new TreeSet<String>();
if(case1 != "") set.add(case1);
if(case2 != "") set.add(case2);
if(case3 != "") set.add(case3);
for(String riqi : set){
System.out.println(riqi);
}
}
//处理日期
static String f(int year,int month,int day){
//1960 年 1 月 1 日 至 2059 年 12 月 31 日。
//判定日期是否合法
if(year >= 60 && year <= 99){
year += 1900;
}else if(year <= 59 && year >= 0){
year += 2000;
}else {
return "";
}
//判断月份是否合法
if(month > 12 || month < 1){
return "";
}
//判断天数是否合法
if(day < 1 || day > 31){
return "";
}
//判断月是否合法
switch (month){
//判断是否满足闰年的天数条件
case 2:
if(isLeap(year) && day > 29) return "";
if(!isLeap(year) && day > 28) return "";
case 4:
if(day > 30) return "";
case 6:
if(day > 30) return "";
case 9:
if(day > 30) return "";
case 11:
if(day > 30) return "";
default:
break;
}
//将int变为字符串,- ""即可
String yearS = year + "";
String monthS = month + "";
String dayS = day + "";
//补0
if(monthS.length() == 1) monthS = '0' + monthS;
if(dayS.length() == 1) dayS = '0' + dayS;
//返回日期
return yearS + "-" + monthS + "-" + dayS;
}
//判断是否为闰年
static boolean isLeap(int year){
return ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0);
}
}