jvee
V2EX  ›  问与答

最近遇到的一个需求

  •  
  •   jvee · Feb 11, 2023 · 2720 views
    This topic created in 1220 days ago, the information mentioned may be changed or developed.

    判断两个日期是否在同一个半年: 比如:2023-01-03 和 2023-06-30 true 2023-06-30 和 2023-07-01 false 各位彦祖们有没有比较优雅的算法

    14 replies    2023-02-12 02:21:23 +08:00
    jmc891205
        1
    jmc891205  
       Feb 11, 2023
    return (Y1 == Y2) && ((M1<=6 && M2<=6) || (M1>=7 && M2 >=7))
    这样就可以吧
    dethan
        2
    dethan  
       Feb 11, 2023 via Android
    不太优雅的:a 和 b 为月份,上半年 Math.max(a, b)<=6 ,下半年 Math.min(a, b)>6
    dumbass
        3
    dumbass  
       Feb 11, 2023 via iPhone
    先判断是不是同一年,再判断是否同时小于等于 6.30 或同时大于 6.30
    qeqv
        4
    qeqv  
       Feb 11, 2023
    这还需要算法吗,按照你的描述,只要年份一样,月份分为两个区间不就算出来了?
    christin
        5
    christin  
       Feb 11, 2023 via iPhone   ❤️ 1
    想减看月份是不是大于 6 不就行了……
    mk3s
        6
    mk3s  
       Feb 11, 2023
    @christin 嗨呀,给你点个赞,好思路,再补充一下,大于等于且同一年
    zhaoxin
        7
    zhaoxin  
       Feb 11, 2023
    @mk3s 你俩在搞笑吧。到底有没有看原博啊。这个半年指的是上半年和下半年。不是你俩以为的时长小于六个月。

    算法应该是先比较年,如果年不同,则否。否则看月份,如果两个都在 1-6 月或两个都在 7-12 月,则是;否则则否。所以 1 楼的就是正确答案。
    ETiV
        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
    ershierdu
        9
    ershierdu  
       Feb 11, 2023
    优雅的没有,但我有一个足够不优雅的 ( doge
    P.S.,纯属开玩笑,代码没有经过测试

    return ((y1 * 16 + m1 + 1) ^ (y2 * 16 + m2 + 1)) // 8 == 0
    IvanLi127
        10
    IvanLi127  
       Feb 11, 2023 via Android   ❤️ 1
    我没有优雅的算法,但我有优雅的写法。

    把楼上的答案封到库里,调用的时候就优雅了
    gaobing
        11
    gaobing  
       Feb 11, 2023
    精简下问题,发现只和月份有关。
    所以,你只需要把 月份 除以 6 ,判断值是否相同即可:
    return m1 / 6 == m2 / 6 。
    gaobing
        12
    gaobing  
       Feb 11, 2023   ❤️ 2
    @gaobing 不好意思,和年份月份有关, (y1 == y2) && (m1 / 6 == m2 / 6 )
    gaobing
        13
    gaobing  
       Feb 11, 2023   ❤️ 1
    @gaobing 半睡半醒的时候尽量不要发帖......,再修正一下:(y1 == y2) && (m1 / 7 == m2 / 7 )
    Jtyczc
        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;
    }
    ```
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1074 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 48ms · UTC 22:59 · PVG 06:59 · LAX 15:59 · JFK 18:59
    ♥ Do have faith in what you're doing.