偷懒用日期拼接年份的,今天都开始报错了 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
exploretheworld
V2EX    程序员

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

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

    这种拼接年份的???
    cc666
        2
    cc666  
       2024-02-29 09:47:02 +08:00   2
    可能是说表单的时间起始和结束范围?选择一年前的数据是 2023-02-29 到 2024-02-29 ,2023-02-29 是个拼接错误?
    exploretheworld
        3
    exploretheworld  
    OP
       2024-02-29 09:50:29 +08:00 via Android
    @celisee 算一年前只减年份
    learnshare
        4
    learnshare  
       2024-02-29 09:53:05 +08:00
    new Date('2023-02-29') => '2023/3/1 08:00:00'
    自动纠错或者报异常,都是尴尬的
    Hopetree
        5
    Hopetree  
       2024-02-29 09:59:10 +08:00   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  
       2024-02-29 09:59:16 +08:00   4

    用库的好处
    chobitssp
        7
    chobitssp  
       2024-02-29 10:07:37 +08:00
    用 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  
       2024-02-29 10:10:53 +08:00
    我自己撸了一个按自然月变更时间的方法,然后每次都是直接增减月数
    sayitagain
        9
    sayitagain  
       2024-02-29 10:12:34 +08:00   5
    问题不大,一个懒可以撑四年,
    NessajCN
        10
    NessajCN  
       2024-02-29 10:16:49 +08:00   1
    只有不懂啥叫 unix timestamp 的培训班前端才会觉得那样是偷懒
    banmuyutian
        11
    banmuyutian  
       2024-02-29 10:22:11 +08:00   2
    说明大部分产品都撑不过 4 个年头
    AllenCai
        12
    AllenCai  
       2024-02-29 10:23:56 +08:00
    if (date.includes('-29')) {
    date= date.replace('-29', '-28')
    }
    修复一下,突出一个死性不改
    AllenCai
        13
    AllenCai  
       2024-02-29 10:26:44 +08:00   2
    @AllenCai
    if (date.includes('02-29')) {
    date= date.replace('02-29', '02-28')
    }
    加上月份,这就完美了
    treblex
        14
    treblex  
       2024-02-29 10:27:16 +08:00
    前几天改了个,自定义写的日期选择器,那哥们儿直接每个月 31 天,然后也不写组件,每个页面拷贝一份,找的头都大了
    pkoukk
        15
    pkoukk  
       2024-02-29 10:27:33 +08:00
    有库还徒手拼?不知道该说懒还是勤快...
    lichao
        16
    lichao  
       2024-02-29 10:31:31 +08:00
    3.1.2 :001 > Time.current.to_date - 1.year
    => Tue, 28 Feb 2023
    74123gzy
        17
    74123gzy  
       2024-02-29 10:57:33 +08:00
    还好我们全是组件跟库
    yinmin
        18
    yinmin  
       2024-02-29 11:07:08 +08:00 via iPhone
    算法供参考:

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

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

    NessajCN
        21
    NessajCN  
       2024-02-29 11:37:48 +08:00
    @lhstock 一年的时间按 365.2422 天,即 31556926 秒来算
    xR13zp0h67njQr2S
        22
    xR13zp0h67njQr2S  
       2024-02-29 13:20:55 +08:00
    手拼不是更累
    imlinhanchao
        23
    imlinhanchao  
       2024-02-29 13:25:08 +08:00   1
    明天就正常了
    rainABC
        24
    rainABC  
       2024-02-29 13:43:50 +08:00
    时间问题是一个永恒的问题
    lhstock
        25
    lhstock  
       2024-02-29 14:13:44 +08:00
    @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
    ```
    106npo
        26
    106npo  
       2024-02-29 14:16:38 +08:00   4
    提工单,安排明天修.明天直接结单,完美.
    NessajCN
        27
    NessajCN  
       2024-02-29 14:17:33 +08:00
    @lhstock 这结果哪里不对吗?
    lhstock
        28
    lhstock  
       2024-02-29 14:24:18 +08:00
    @NessajCN 带入一个场景 我今天办了年会,明天是 28 到期,我再办又是 3.1 => 3.1 => 2.29 => 2.28 反复循环,
    kneo
        29
    kneo  
       2024-02-29 14:26:25 +08:00 via Android
    这都能错,我是难以理解。
    youyouzi
        30
    youyouzi  
       2024-02-29 14:27:28 +08:00
    @binaryify dayjs 好评
    NessajCN
        31
    NessajCN  
       2024-02-29 14:29:08 +08:00
    @lhstock 所以可否再描述一下这到底哪儿不对了?
    你是觉得要每年都应该同一天办年会的话,那 29 号根本就不可能被设为年会日,相应的计算方法也不会按一年来加减
    NessajCN
        32
    NessajCN  
       2024-02-29 14:31:27 +08:00
    @lhstock 更正一下,年会要同一天也同样是这样算最好,因为你不可能安排在 2 月 29 做固定年会日,而其他日期的话这样算是不会错的
    hubaq
        33
    hubaq  
       2024-02-29 14:44:44 +08:00   1
    @lhstock
    爱奇艺:会员月卡服务时间以自然月为统计单位,即自服务开通日期,根据开通当月自然月天数做顺延
    腾讯:月服务期限:开通当日起 31 天
    laoona
        34
    laoona  
       2024-02-29 14:48:21 +08:00
    @treblex 真牛逼 重构吧
    8355
        35
    8355  
       2024-02-29 14:50:10 +08:00
    这种代码,说真的,自己懒的写写个注释都能自动生成了。。
    vituralfuture
        36
    vituralfuture  
       2024-02-29 14:50:41 +08:00 via Android
    日期,时间这种有标准的东西最好不要自己造轮子或者自己手动完成某些功能,因为非常容易忽略一些细节,比如大部分人都不会考虑的夏令时,润秒,时区。类似的还有 cookie ,http 协议等各种网络协议,又琐碎又容易出错
    nzynzynzy
        37
    nzynzynzy  
       2024-02-29 15:26:16 +08:00
    一个环境和一个环境格式都不一样,不知道拼接的意义是啥,new Date()也不费啥事
    zhushishi
        38
    zhushishi  
       2024-02-29 16:25:29 +08:00
    总有 2b 喜欢这么写。。。
    jeansfish
        39
    jeansfish  
       2024-02-29 16:36:00 +08:00
    GoPro 今天居然是 3 月 1 日。
    Yuhyeong
        40
    Yuhyeong  
       2024-02-29 16:54:40 +08:00
    /t/1019435 是你吗兄弟
    rongsh
        41
    rongsh  
       2024-02-29 17:47:23 +08:00
    之前设置 iphone 专注模式中的工作模式到下午 5 点关闭,然而今天没有关闭。想知道有其他人遇到吗,会不会也是因为闰日这个原因导致的 bug 。
    panbeta
        42
    panbeta  
       2024-02-29 18:01:09 +08:00
    好低级的错误。。。每 4 年一个 29 日属于常识了,写日期类逻辑必须用 calendar 处理,字符串拼接的算你们
    Pastsong
        43
    Pastsong  
       2024-02-29 18:14:45 +08:00
    日期时间这种全是坑的东西还有人不用库的。。
    killuma
        44
    killuma  
       2024-02-29 18:50:44 +08:00
    我的 Apple Music4 月 29 日过期,怎么今天就显示过期了??
    https://imgur.com/Q3nlkTT.jpg
    https://imgur.com/0rMCOeK.jpg
    itechify
        45
    itechify  
    PRO
       2024-02-29 19:12:25 +08:00 via Android
    @AllenCai 假如是今天呢?
    JensenQian
        46
    JensenQian  
       2024-02-29 19:21:10 +08:00 via Android
    刚 b 站看到的
    注意看评论区
    [img][/img]
    [img][/img]
    DavidA
        47
    DavidA  
       2024-02-29 23:24:36 +08:00
    我甚至没看懂什么问题,谁来告诉我,错误的代码是什么样的?
    Felldeadbird
        48
    Felldeadbird  
       2024-03-01 09:19:37 +08:00
    一年前我都是用 365 天来算的。懒得算闰年。
    lyxxxh2
        49
    lyxxxh2  
       2024-03-01 09:57:33 +08:00
    @DavidA
    我一开始: 难道出什么世界级 bug 了? 日历 30 号怎么不见了? 难道我日历也有 bug? (没想起是闰年)
    后面: ... 就是人乱写导致的。 但凡用官方的日期函数或在用库都不会出现 bug 。
    atpex
        50
    atpex  
       2024-03-01 16:35:01 +08:00
    @lyxxxh2 不是闰年 2 月也不会有 30 号。。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2589 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 32ms UTC 09:01 PVG 17:01 LAX 01:01 JFK 04:01
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86