两个字符串日期比较范围

今天在改一个以前同事留下的功能时,发现比较日期字符串写得很复杂。主要是判断两个日期字符串的范围是否超过1年。
因为是JS比较字符串,所以是先截取出年月日,然后依次比较年月日。写得很复杂,先判断后者年份是否大于前者,是否小于前者,是否相等,如果年份相等,则满足条件;如果大于,是否刚好差距为1,不为1则不满足条件,如果刚好为1,则一次判断月份值和日期值。代码逻辑理解起来很绕,而且还出错了。

于是自己简单总结一下两种方法和可能出现的问题:

  1. 转成标准日期再进行比较

    先将字符串转换成标准日期,再比较两者大小。Java API比较多,就不再赘述。
    其中js 使用 var date = new Date(dateString); 的方式进行转换,
    其中要注意的是 dateString的格式必须是 yyyy/MM/dd 的格式。

  2. 直接将字符串的年月份拼接比较

    直接将字符串的年月日进行拼接,如 2021-06-07 拼成 20210607 这样进行比较,这种方式初步看来是没有问题的,但实际上 2021-6-7 这种格式也是存在的,那么拼接出来就是 202167 ,这样去比较的话肯定是有问题的。我们只需要使用

	int date = yyyy * 1000 + MM * 100 +dd;
	这样不管是 2021-06-07 还是 2021-6-7 拼接出来的都是 20210607
  • [ ? ] 我们现在思考下为什么会有这样的问题:

    比较字符串最开始想到的是直接将各个位数相加起来,比如 yyyy + MM + dd
    ,那么 2021-06-07 相加就是 2021 + 6 +7 = 2034 ,很明显这样是不行的,年月日在日期中的权重值是不一样的,直接相加就把三个时间单位的权重值算成相同的了,这样时间单位小的数值会影响时间单位大的数值。比如2020 - 6 -7 和 2019 - 6 -8 后面的日期明显比前面的小,如果直接相加反而后面的更大。所以我们要给年月日分别设置合理的权重值。

  • [ ? ] 如何设置权重值
    年月之间的换算倍数是 12 ,月和日之间的换算倍数是28到31 ,我们可以勉强认为是 30 。
    那么如果设置不同单位之间的权重值大于实际情况的权重值,那么是不是就符合实际情况?
    比如年月之间的换算单位是 12 ,如果我设置年月的权重分别为 100 和 1 ,那么是不是就是 不管这个月份再怎么差距大,都影响不了年份的比较结果。 比如年份相差 2 ,那就是相差 200 ,月份即使相差11,也只弥补了 11 ,依然远小于 200 。也就是说 两个日期比较大小的最终结果还是由年份决定的。 那么依旧这个道理:日和月之间的换算单位也算做 100 ,那么是不是就是日值之间的差距永远无法影响到月的值差距上?
    所以最后我们约定三个时间单位的权重分别是年月日:10000 100 1 刚好相邻两个单位之间的权重差是100 ,远大于实际中的权重差,所以算出来的值的比较结果是符合要求的。
    结果没想到本来是为了方便计算,却刚好算出来的值是 三个时间单位的字符串拼接结果,而且是那种不用考虑值小于10时 有没有带0 的情况(比如7月 07 和7)。
    这种就是巧合吧,不过从这里也发现很多时候还是要多思考,很多东西都是相通的。

		String beginDate = "2021-1-12";
		String endDate = "2020-12-12";
		String[] begin = beginDate.split("-");
		String[] end = endDate.split("-");
		int beginTotal = Integer.parseInt(begin[0]) * 10000 + Integer.parseInt(begin[1]) *100
				+ Integer.parseInt(begin[2]);
		int endTotal = Integer.parseInt(end[0]) *10000 + Integer.parseInt(end[1])*100
				+ Integer.parseInt(end[2]);
		System.out.println(beginTotal);
		System.out.println(endTotal);
		if (beginTotal >= endTotal) {
			System.out.println(beginDate + "大于或等于" + endDate);
		} else {
			System.out.println(beginDate + "大于或者" + endDate);
		}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
EDAW旅游规划是根据EDAW(Environmental Design + Analysis Workshop)公司的专业知识和经验,为客户提供全方位的旅游规划服务。EDAW是一家国际性的设计和规划咨询公司,致力于城市和环境设计领域。 EDAW旅游规划的目标是为客户提供一流的旅游体验和可持续发展的旅游目的地。在规划过程中,EDAW会综合考虑目的地的资源、环境、社会经济和文化等方面的因素,以确保规划的可行性和可持续性。 首先,EDAW会对目的地的自然和文化资源进行全面评估和分析,了解其独特之处和发展潜力。然后,根据市场需求和客户的要求,制定旅游发展策略和规划框架。在规划过程中,EDAW会注重保护和提升目的地的自然环境,并尽量减少负面影响。 接下来,EDAW会进行市场调研和定位分析,确定目标客户群体和市场定位。根据市场需求,制定针对不同客户群体的旅游产品和服务策略,以提供个性化的旅游体验。 此外,EDAW还会考虑目的地的交通、酒店、餐饮等基础设施建设和改善,以提升旅游服务的质量和效率。同时,也会加强目的地的宣传推广,吸引更多的游客和投资者。 最后,EDAW还会制定监测和评估机制,以跟踪旅游规划的实施效果,并根据需要进行调整和改进。 总而言之,EDAW旅游规划是一个综合性的过程,旨在为客户提供可持续发展的旅游目的地,创造卓越的旅游体验。通过综合考虑资源、环境、经济和文化等因素,EDAW可为客户提供有效的旅游规划解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值