
判断两个日期是否在同一个半年: 比如:2023-01-03 和 2023-06-30 true 2023-06-30 和 2023-07-01 false 各位彦祖们有没有比较优雅的算法
1 jmc891205 Feb 11, 2023 return (Y1 == Y2) && ((M1<=6 && M2<=6) || (M1>=7 && M2 >=7)) 这样就可以吧 |
2 dethan Feb 11, 2023 via Android 不太优雅的:a 和 b 为月份,上半年 Math.max(a, b)<=6 ,下半年 Math.min(a, b)>6 |
3 dumbass Feb 11, 2023 via iPhone 先判断是不是同一年,再判断是否同时小于等于 6.30 或同时大于 6.30 |
4 qeqv Feb 11, 2023 这还需要算法吗,按照你的描述,只要年份一样,月份分为两个区间不就算出来了? |
5 christin Feb 11, 2023 via iPhone 想减看月份是不是大于 6 不就行了…… |
7 zhaoxin Feb 11, 2023 @mk3s 你俩在搞笑吧。到底有没有看原博啊。这个半年指的是上半年和下半年。不是你俩以为的时长小于六个月。 算法应该是先比较年,如果年不同,则否。否则看月份,如果两个都在 1-6 月或两个都在 7-12 月,则是;否则则否。所以 1 楼的就是正确答案。 |
8 ETiV Feb 11, 2023 转成数字处理,(年度相同)且 [(月份数字-1 )/6] 的整数部分相同 let sameSemiYear = (ymd1, ymd2) => { let ym1 = parseInt(ymd1.replace(/-\d+$/, '').replace('-','')), ym2 = parseInt(ymd2.replace(/-\d+$/, '').replace('-','')) return Math.floor(ym1/100) === Math.floor(ym2/100) && Math.floor((ym1-1)%100/6) === Math.floor((ym2-1)%100/6) } sameSemiYear('2023-01-03', '2023-06-30') // true sameSemiYear('2023-06-30', '2023-07-01') // false |
9 ershierdu Feb 11, 2023 优雅的没有,但我有一个足够不优雅的 ( doge P.S.,纯属开玩笑,代码没有经过测试 return ((y1 * 16 + m1 + 1) ^ (y2 * 16 + m2 + 1)) // 8 == 0 |
10 IvanLi127 Feb 11, 2023 via Android 我没有优雅的算法,但我有优雅的写法。 把楼上的答案封到库里,调用的时候就优雅了 |
11 gaobing Feb 11, 2023 精简下问题,发现只和月份有关。 所以,你只需要把 月份 除以 6 ,判断值是否相同即可: return m1 / 6 == m2 / 6 。 |
14 Jtyczc Feb 12, 2023 应该是转化为时间戳来计算。 https://apidoc.gitee.com/dromara/hutool/ betweenMonth public long betweenMonth(boolean isReset) 计算两个日期相差月数 在非重置情况下,如果起始日期的天大于结束日期的天,月数要少算 1 (不足 1 个月) Parameters: isReset - 是否重置时间为起始时间(重置天时分秒) Returns: 相差月数 Since: 3.0.8 ```java public DateBetween(Date begin, Date end, boolean isAbs) { Assert.notNull(begin, "Begin date is null !", new Object[0]); Assert.notNull(end, "End date is null !", new Object[0]); if (isAbs && begin.after(end)) { this.begin = end; this.end = begin; } else { this.begin = begin; this.end = end; } } public long betweenMonth(boolean isReset) { Calendar beginCal = DateUtil.calendar(this.begin); Calendar endCal = DateUtil.calendar(this.end); int betweenYear = endCal.get(1) - beginCal.get(1); int betweenMOnthOfYear= endCal.get(2) - beginCal.get(2); int result = betweenYear * 12 + betweenMonthOfYear; if (!isReset) { endCal.set(1, beginCal.get(1)); endCal.set(2, beginCal.get(2)); long between = endCal.getTimeInMillis() - beginCal.getTimeInMillis(); if (between < 0L) { return (long)(result - 1); } } return (long)result; } ``` |