1328: [蓝桥杯2017初赛]日期问题

本文介绍了一个日期解析的问题,目标是将不规范的历史文献日期转换为标准的“yyyy-MM-dd”格式。讨论了日期格式的多样性,包括年/月/日、月/日/年和日/月/年,并提供了一个Java解决方案,用于解析并输出所有可能的有效日期。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

时间限制: 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);
	}
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值