时间限制: 1 Sec 内存限制: 256 MB
题目描述
小明正在整理一批历史文献。这些历史文献中出现了很多日期。 小明知道这些日期都在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
实现:
public class Main {
public static Set<Long> set = new TreeSet<Long>();
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.next();
String[] split = s.split("/");
int a = Integer.parseInt(split[0]);
int b = Integer.parseInt(split[1]);
int c = Integer.parseInt(split[2]);
y_m_d(a,b,c); //年月日
y_m_d(c,b,a); //日月年
y_m_d(c,a,b); //月日年
//将set中的毫秒值转为日期输出
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
for (Long times : set) {
Date date2 = new Date();
date2.setTime(times);
String format = sdf.format(date2);
System.out.println(format);
}
}
//1960年1月1日至2059年12月31日
//02/03/04
//年月日
private static void y_m_d(int a, int b, int c) {
//确定年
if(a>59&&a<100) a += 1900;
else if(a<60&&a>=0) a += 2000;
else return;
//将月份不合法的去掉
if(b<1 || b>12) return;
//将日期不合法的去掉
if(c<1 || c > 31)return;
switch(b){
case 2:
if(isRun(a) && c > 29) return;
if(!isRun(a) && c > 28) return;
break;
case 4:
if(c>30) return;
break;
case 6:
if(c>30) return;
break;
case 9:
if(c>30) return;
break;
case 11:
if(c>30) return;
break;
default:break;
}
//合法的日期,进行排序和去重
String date = a+"-"+b+"-"+c;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date okDate = null;
try {
okDate = sdf.parse(date);
} catch (ParseException e) {
e.printStackTrace();
}
//获取日期的毫秒值,以便排序
set.add(okDate.getTime());
}
//判断是否是闰年
private static boolean isRun(int a) {
return (a%4==0 && a%100!= 0) || (a%400==0);
}
}