V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
exploretheworld
V2EX  ›  程序员

偷懒用日期拼接年份的,今天都开始报错了

  •  1
     
  •   exploretheworld · 298 天前 via Android · 15767 次点击
    这是一个创建于 298 天前的主题,其中的信息可能已经有所发展或是发生改变。
    什么 2023-02-29 ,笑了
    50 条回复    2024-03-01 16:35:01 +08:00
    celisee
        1
    celisee  
       298 天前
    昨天就接到通知,统一排查了一遍

    这种拼接年份的???
    cc666
        2
    cc666  
       298 天前   ❤️ 2
    可能是说表单的时间起始和结束范围?选择一年前的数据是 2023-02-29 到 2024-02-29 ,2023-02-29 是个拼接错误?
    exploretheworld
        3
    exploretheworld  
    OP
       298 天前 via Android
    @celisee 算一年前只减年份
    learnshare
        4
    learnshare  
       298 天前
    new Date('2023-02-29') => '2023/3/1 08:00:00'
    自动纠错或者报异常,都是尴尬的
    Hopetree
        5
    Hopetree  
       298 天前   ❤️ 1
    这是 Python 的,不会报错,一年前是 2023-02-28

    ```python
    from datetime import datetime
    from dateutil.relativedelta import relativedelta
    current_date = datetime.now()
    current_date - relativedelta(years=1)
    datetime.datetime(2023, 2, 28, 9, 57, 56, 185222)
    ```
    binaryify
        6
    binaryify  
       298 天前   ❤️ 4

    用库的好处
    chobitssp
        7
    chobitssp  
       298 天前
    用 moment 不才算偷懒吗

    var date = '2024-02-29';
    moment(date).add(-1, 'years').format('YYYY-MM-DD');
    date.replace(/^\d{4}/, t => parseInt(t, 10) - 1);
    date.split('-').map((t, i) => i > 0 ? t : parseInt(t, 10) - 1).join('-');
    hi2hi
        8
    hi2hi  
       298 天前
    我自己撸了一个按自然月变更时间的方法,然后每次都是直接增减月数
    sayitagain
        9
    sayitagain  
       298 天前   ❤️ 5
    😁问题不大,一个懒可以撑四年,
    NessajCN
        10
    NessajCN  
       298 天前   ❤️ 1
    只有不懂啥叫 unix timestamp 的培训班前端才会觉得那样是偷懒
    banmuyutian
        11
    banmuyutian  
       298 天前   ❤️ 2
    说明大部分产品都撑不过 4 个年头
    AllenCai
        12
    AllenCai  
       298 天前
    if (date.includes('-29')) {
    date= date.replace('-29', '-28')
    }
    修复一下,突出一个死性不改
    AllenCai
        13
    AllenCai  
       298 天前   ❤️ 2
    @AllenCai
    if (date.includes('02-29')) {
    date= date.replace('02-29', '02-28')
    }
    加上月份,这就完美了
    treblex
        14
    treblex  
       298 天前
    前几天改了个,自定义写的日期选择器,那哥们儿直接每个月 31 天😂,然后也不写组件,每个页面拷贝一份,找的头都大了
    pkoukk
        15
    pkoukk  
       298 天前
    有库还徒手拼?不知道该说懒还是勤快...
    lichao
        16
    lichao  
       298 天前
    3.1.2 :001 > Time.current.to_date - 1.year
    => Tue, 28 Feb 2023
    74123gzy
        17
    74123gzy  
       298 天前
    还好我们全是组件跟库
    yinmin
        18
    yinmin  
       298 天前 via iPhone
    算法供参考:

    日期型变量 d ,获取日期 d 对应月份的最后一天

    date(d.year,d.month,1).addmonth(1).addday(-1)
    lhstock
        19
    lhstock  
       298 天前   ❤️ 2
    没做过相关业务,我怎么感觉这不是单纯的技术问题;应该还要考虑产品或行业规范来实现吧,比如会员一年,按 366 还是 365 算呢;
    具体点就是 24.02.29 开通的,应该什么时候过期;客户对于这个时间会不会有争议呢;
    同样的问题还有一个月。2.1 开通一个月,那应该什么时候到期呢
    确实没写过相关的业务,纯好奇不是杠
    SimonOne
        20
    SimonOne  
       298 天前
    @yinmin #18 我写 abap 也这么整的。

    NessajCN
        21
    NessajCN  
       298 天前
    @lhstock 一年的时间按 365.2422 天,即 31556926 秒来算
    xR13zp0h67njQr2S
        22
    xR13zp0h67njQr2S  
       298 天前
    手拼不是更累
    imlinhanchao
        23
    imlinhanchao  
       298 天前   ❤️ 1
    明天就正常了
    rainABC
        24
    rainABC  
       298 天前
    时间问题是一个永恒的问题
    lhstock
        25
    lhstock  
       298 天前
    @NessajCN 我尝试换算 31556926 秒;计算未来几年的结果应该很难被用户接受吧;所以产品与用户对于年的定义是如何保持一致
    ```
    const timer = new Date().getTime();
    const test = (n = 0) => new Date(+timer + n * 31556926*1000).toLocaleDateString();
    console.log(test(0))
    console.log(test(1))
    console.log(test(2))
    console.log(test(3))
    console.log(test(4))
    // 输出如下:
    2024/2/29
    2025/2/28
    2026/3/1
    2027/3/1
    2028/2/29
    ```
    xmumiffy
        26
    xmumiffy  
       298 天前   ❤️ 4
    提工单,安排明天修.明天直接结单,完美.
    NessajCN
        27
    NessajCN  
       298 天前
    @lhstock 这结果哪里不对吗?
    lhstock
        28
    lhstock  
       298 天前
    @NessajCN 带入一个场景 我今天办了年会,明天是 28 到期,我再办又是 3.1 => 3.1 => 2.29 => 2.28 反复循环,
    kneo
        29
    kneo  
       298 天前 via Android
    这都能错,我是难以理解。
    youyouzi
        30
    youyouzi  
       298 天前
    @binaryify dayjs 好评
    NessajCN
        31
    NessajCN  
       298 天前
    @lhstock 所以可否再描述一下这到底哪儿不对了?
    你是觉得要每年都应该同一天办年会的话,那 29 号根本就不可能被设为年会日,相应的计算方法也不会按一年来加减
    NessajCN
        32
    NessajCN  
       298 天前
    @lhstock 更正一下,年会要同一天也同样是这样算最好,因为你不可能安排在 2 月 29 做固定年会日,而其他日期的话这样算是不会错的
    hubaq
        33
    hubaq  
       298 天前   ❤️ 1
    @lhstock
    爱奇艺:会员月卡服务时间以自然月为统计单位,即自服务开通日期,根据开通当月自然月天数做顺延
    腾讯:月服务期限:开通当日起 31 天
    laoona
        34
    laoona  
       298 天前
    @treblex 真牛逼 重构吧
    8355
        35
    8355  
       298 天前
    这种代码,说真的,自己懒的写写个注释都能自动生成了。。
    vituralfuture
        36
    vituralfuture  
       298 天前 via Android
    日期,时间这种有标准的东西最好不要自己造轮子或者自己手动完成某些功能,因为非常容易忽略一些细节,比如大部分人都不会考虑的夏令时,润秒,时区。类似的还有 cookie ,http 协议等各种网络协议,又琐碎又容易出错
    nzynzynzy
        37
    nzynzynzy  
       298 天前
    一个环境和一个环境格式都不一样,不知道拼接的意义是啥,new Date()也不费啥事
    zhushishi
        38
    zhushishi  
       298 天前
    总有 2b 喜欢这么写。。。
    jeansfish
        39
    jeansfish  
       298 天前
    GoPro 今天居然是 3 月 1 日。
    Yuhyeong
        40
    Yuhyeong  
       298 天前
    /t/1019435 是你吗兄弟
    rongsh
        41
    rongsh  
       298 天前
    之前设置 iphone 专注模式中的工作模式到下午 5 点关闭,然而今天没有关闭。想知道有其他人遇到吗,会不会也是因为闰日这个原因导致的 bug 。
    panbeta
        42
    panbeta  
       298 天前
    好低级的错误。。。每 4 年一个 29 日属于常识了,写日期类逻辑必须用 calendar 处理,字符串拼接的算你们🐂
    Pastsong
        43
    Pastsong  
       298 天前
    日期时间这种全是坑的东西还有人不用库的。。
    killuma
        44
    killuma  
       298 天前
    我的 Apple Music4 月 29 日过期,怎么今天就显示过期了??
    https://imgur.com/Q3nlkTT.jpg
    https://imgur.com/0rMCOeK.jpg
    oneisall8955
        45
    oneisall8955  
       298 天前 via Android
    @AllenCai 假如是今天呢?
    JensenQian
        46
    JensenQian  
       298 天前 via Android
    刚 b 站看到的
    注意看评论区
    [img][/img]
    [img][/img]
    DavidA
        47
    DavidA  
       298 天前
    我甚至没看懂什么问题,谁来告诉我,错误的代码是什么样的?
    Felldeadbird
        48
    Felldeadbird  
       297 天前
    一年前我都是用 365 天来算的。懒得算闰年。
    lyxxxh2
        49
    lyxxxh2  
       297 天前
    @DavidA
    我一开始: 难道出什么世界级 bug 了? 日历 30 号怎么不见了? 难道我日历也有 bug? (没想起是闰年)
    后面: ... 就是人乱写导致的。 但凡用官方的日期函数或在用库都不会出现 bug 。
    atpex
        50
    atpex  
       297 天前
    @lyxxxh2 不是闰年 2 月也不会有 30 号。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1081 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 19:12 · PVG 03:12 · LAX 11:12 · JFK 14:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.