你今天因为 YYYY-MM-dd 被提 BUG 了吗 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
zhuzhiqiang
V2EX    程序员

你今天因为 YYYY-MM-dd 被提 BUG 了吗

  •  1
     
  •   zhuzhiqiang
    zhuzhiqiang18 2019-12-30 17:39:49 +08:00 34749 次点击
    这是一个创建于 2179 天前的主题,其中的信息可能已经有所发展或是发生改变。

    同事之前的代码使用 YYYY-MM-dd 今天被捶了 [捂脸]

    第 1 条附言    2019-12-31 11:13:13 +08:00
    get 到这个 BUG 就好 愿各位无 BUG[滑稽]
    114 条回复    2020-12-31 15:19:36 +08:00
    1  2  
    GuryYu
        1
    GuryYu  
       2019-12-30 17:41:46 +08:00
    同遇到
    mahogany
        2
    mahogany  
       2019-12-30 17:49:59 +08:00
    你说的这个同事是不是...
    i36lib
        3
    i36lib  
       2019-12-30 17:57:14 +08:00
    提了什么 BUG ?
    eve1yb0dy
        4
    eve1yb0dy  
       2019-12-30 17:58:38 +08:00   1
    <?php date('o-W'); // 跨年查询 BUG 用 o-W 代替 Y-W
    ColoThor
        5
    ColoThor  
       2019-12-30 17:59:30 +08:00
    黑人问号.jpg
    BenjaminReed
        6
    BenjaminReed  
       2019-12-30 18:03:21 +08:00
    一不小心就踩坑了
    aliveyang
        7
    aliveyang  
       2019-12-30 18:03:48 +08:00   1
    黑人问号.jpg
    chendy
        8
    chendy  
       2019-12-30 18:05:53 +08:00   45
    YYYY 是 week-based-year,今天就已经 2020 年了
    yyyy 还是 2019 年
    wpblank
        9
    wpblank  
       2019-12-30 18:08:27 +08:00
    哈哈哈哈 我在昨天也遇见了
    annielong
        10
    annielong  
       2019-12-30 18:08:28 +08:00/span>
    一直用 yyyy-MM-dd
    opengps
        11
    opengps  
       2019-12-30 18:15:47 +08:00   1
    为了照顾前端同学,我更习惯 yyyy/MM/dd HH:mm:ss
    PerFectTime
        12
    PerFectTime  
       2019-12-30 18:21:45 +08:00
    Curtion
        13
    Curtion  
       2019-12-30 18:25:07 +08:00
    我写的 HH:MM::ss。。。。我服了
    beastk
        14
    beastk  
       2019-12-30 18:26:50 +08:00 via iPhone
    Y-m-d H:i:s 会呗锤吗
    jybox
        15
    jybox  
       2019-12-30 18:32:13 +08:00
    sheeta
        16
    sheeta  
       2019-12-30 18:35:36 +08:00
    @beastk PHP 不受影响
    itwhat
        17
    itwhat  
       2019-12-30 18:36:46 +08:00
    Python 不受影响
    W1angMh
        18
    W1angMh  
       2019-12-30 18:57:08 +08:00
    java 刚毕业的时候写过 HH:MM:SS 做时分秒转换 被同事笑了好久
    iFlicker
        19
    iFlicker  
       2019-12-30 20:02:54 +08:00
    试了一下笑死我了
    scalaer
        20
    scalaer  
       2019-12-30 20:06:51 +08:00
    spark sql
    ----
    select
    ...,
    from_unixtime(unix_timestamp(time, "dd/MMM/yyyy:HH:mm:ss +0800"), "YYYY-MM-dd HH:mm:00") as time
    from xxx


    然后解析到 2020 年了 ...
    xuyang2
        21
    xuyang2  
       2019-12-30 20:16:55 +08:00
    @iFlicker
    文档清清楚楚写明了:

    u year
    y year-of-era
    Y week-based-year

    有啥可笑的
    iFlicker
        22
    iFlicker  
       2019-12-30 20:29:26 +08:00 via Android
    @xuyang2 没没没。。只是觉得好玩。。
    WordTian
        23
    WordTian  
       2019-12-30 20:33:14 +08:00 via Android
    今天公司有个系统崩了,应该和这个有关系
    ccming
        24
    ccming  
       2019-12-30 20:45:54 +08:00 via iPhone
    ccming
        25
    ccming  
       2019-12-30 20:46:37 +08:00 via iPhone   1
    w99w
        26
    w99w  
       2019-12-30 21:11:20 +08:00
    ccming
        27
    ccming  
       2019-12-30 21:42:05 +08:00 via iPhone
    @w99w 看不到图
    NealCCC
        28
    NealCCC  
       2019-12-30 21:46:21 +08:00 via Android
    我去,今天刚改了个同事的这个 bug
    whileFalse
        29
    whileFalse  
       2019-12-30 21:47:52 +08:00 via iPhone
    想请教这个 week based year 是个啥,以及有没有基于农历的公历纪年,谢谢
    lithiumii
        30
    lithiumii  
       2019-12-30 21:53:27 +08:00
    神奇,写 py 而且长期使用 pandas.Timestamp 而非自带的 datetime (因为前者更无脑)的我表示涨姿势了
    rockyou12
        31
    rockyou12  
       2019-12-30 21:55:40 +08:00   1
    所以这个 week based year 有啥实际业务用得到的嘛,实在想不出来……
    Lax
        32
    Lax  
       2019-12-30 22:11:39 +08:00
    前几个月在淘宝 app 的消息列表看到这个问题,当时就知道年底会来这么一波,哈哈哈
    redtea
        33
    redtea  
       2019-12-30 22:25:54 +08:00 via iPhone
    昨天在饿了么买了优惠券,用不了,显示的开始时间是 1 年后,应该也是这个问题。
    xkzhangsan
        34
    xkzhangsan  
       2019-12-30 23:46:47 +08:00
    limbo0
        35
    limbo0  
       2019-12-30 23:51:54 +08:00 via Android
    这个 java 和 python 的计算方式还不一样,预计我们的系统 2022 年会有一次 bug
    nikoo
        36
    nikoo  
       2019-12-30 23:55:22 +08:00
    week based year 是什么意思?

    为什么现在才 2019 用 "YYYY" 会返回 2020 ?
    Yvette
        37
    Yvette  
       2019-12-31 00:23:28 +08:00   3
    If a week is split at the end of the year then it is assigned to the year in which more that half of the days of that week occur.

    https://nakedsecurity.sophos.com/2019/12/23/serious-security-the-decade-ending-y2k-bug-that-wasnt/
    ddllzz
        38
    ddllzz  
       2019-12-31 00:36:47 +08:00 via Android
    昨天在 Laravel 中用到 Carbon 包的 weekOfYear 方法,返回结果是 1,还以为是 bug,其实标准就是认为昨天是 2020 年第一周。

    看了上面各位说的,感觉自己就是个菜逼。
    EminemW
        39
    EminemW  
       2019-12-31 00:45:01 +08:00 via iPhone
    @nikoo 按周算年份,其实这一周都算 2020 年
    imycc
        40
    imycc  
       2019-12-31 01:00:16 +08:00
    还有这么人性化的接口,之前真没想到过。。
    Count0
        41
    Count0  
       2019-12-31 02:31:53 +08:00
    千年虫再现。
    dangyuluo
        42
    dangyuluo  
       2019-12-31 03:07:58 +08:00
    @Lax 前几个月是什么 bug ?
    lihongming
        43
    lihongming  
       2019-12-31 03:46:36 +08:00 via iPhone
    这些人都哪儿学的?我从一开始学日期格式就是小-大-小 大:小:小,也没见开源代码里用过大 Y
    wensonsmith
        44
    wensonsmith  
       2019-12-31 07:57:05 +08:00 via iPhone   1
    Y-m-d 亚麻跌
    1daydayde
        45
    1daydayde  
       2019-12-31 08:29:38 +08:00 via iPhone
    吓得我赶紧看了一下
    NSAtools
        46
    NSAtools  
       2019-12-31 08:31:29 +08:00
    昨天刚填的坑
    xwbz2018
        47
    xwbz2018  
       2019-12-31 08:37:33 +08:00 via Android
    div class="reply_content">JAVA8 的 localdate 用的是 uuuu-MM-dd,不知道有没有坑
    itechify
        48
    itechify  
    PRO
       2019-12-31 08:39:15 +08:00 via Android
    笑死了,去年这个时候用的 YYYY,业务说时间不对我还不信,检查了一波脑壳痛,就这个地方用了大写的 Y
    killergun
        49
    killergun  
       2019-12-31 08:42:10 +08:00
    C# 没这问题
    May725
        50
    May725  
       2019-12-31 08:46:00 +08:00 via iPhone
    涨姿势了
    acthtml
        51
    acthtml  
       2019-12-31 08:46:58 +08:00
    got
    randyo
        52
    randyo  
       2019-12-31 08:47:16 +08:00 via Android
    还好前端 moment 根本不支持小 y
    xuanbg
        53
    xuanbg  
       2019-12-31 09:02:42 +08:00
    为啥要写 YYYY ?没有 get 到这个点呢。标准的写法不都是 yyyy-MM-dd 吗
    IMCA1024
        54
    IMCA1024  
       2019-12-31 09:09:39 +08:00
    一直习惯用 yyyy-MM-dd HH:mm:ss 改一个都不习惯
    sagaxu
        55
    sagaxu  
       2019-12-31 09:14:59 +08:00 via Android   1
    @xwbz2018 uuuu 和 yyyy 在处理公元前年份时行为不同
    songjiaxin2008
        56
    songjiaxin2008  
       2019-12-31 09:24:25 +08:00
    golang 没有这个问题
    ```golang
    fmt.Println(time.Now().Format("2006-01-02 15:04:05")) // 2019-12-31 09:25:20
    ```
    Mutoo
        57
    Mutoo  
       2019-12-31 09:29:37 +08:00
    bobuick
        58
    bobuick  
       2019-12-31 09:36:14 +08:00
    无敌大坑货。 官方就不应该出现 YYYY 这种算法方式,坑人。
    raysonlu
        59
    raysonlu  
       2019-12-31 09:40:36 +08:00
    @ddllzz 这是什么函数?不是说 PHP 没有这个 BUG 么?
    JR1024
        60
    JR1024  
       2019-12-31 09:42:33 +08:00   1
    Calendar calendar = Calendar.getInstance();
    // 2019-12-31
    calendar.set(2019, Calendar.DECEMBER, 31);
    Date strDate1 = calendar.getTime();
    // 2020-01-01
    calendar.set(2020, Calendar.JANUARY, 1);
    Date strDate2 = calendar.getTime();
    // 大写 YYYY
    DateFormat formatUpperCase = new SimpleDateFormat("YYYY/MM/dd");
    System.out.println("2019-12-31 to YYYY/MM/dd: " + formatUpperCase.format(strDate1));
    System.out.println("2020-01-01 to YYYY/MM/dd: " + formatUpperCase.format(strDate2));
    // 小写 YYYY
    DateFormat formatLowerCase = new SimpleDateFormat("yyyy/MM/dd");
    System.out.println("2019-12-31 to yyyy/MM/dd: " + formatLowerCase.format(strDate1));
    System.out.println("2020-01-01 to yyyy/MM/dd: " + formatLowerCase.format(strDate2));
    b821025551b
        61
    b821025551b  
       2019-12-31 09:51:44 +08:00   2
    @xwbz2018 #47 u 和 y 的区别主要是公元前的年份,用 y 是正数,需要加个 G 来区分是 AD 还是 BC ;用 u 直接负数代表元前,但公元前部分+1 才和我们常规记年相等。
    WEBUG
        62
    WEBUG  
       2019-12-31 09:57:33 +08:00 via Android
    弱弱问一句 sql 里没有这个问题吧
    Dragonish3600
        63
    Dragonish3600  
       2019-12-31 09:59:20 +08:00 via iPhone
    腾讯都挂了好么
    QQ 嗯生日提醒,明明是 2020 年 1 月,然后非提说日子已经过了
    demo
        64
    demo  
       2019-12-31 10:05:18 +08:00
    date-fns^2.8.1 的 YYYY 未发现这个问题
    encro
        65
    encro  
       2019-12-31 10:05:18 +08:00
    https://www.php.net/manual/en/function.date.php

    ```
    Things to be aware of when using week numbers with years.

    <?php
    echo date("YW", strtotime("2011-01-07")); // gives 201101
    echo date("YW", strtotime("2011-12-31")); // gives 201152
    echo date("YW", strtotime("2011-01-01")); // gives 201152 too
    ?>

    BUT

    <?php
    echo date("oW", strtotime("2011-01-07")); // gives 201101
    echo date("oW", strtotime("2011-12-31")); // gives 201152
    echo date("oW", strtotime("2011-01-01")); // gives 201052 (Year is different than previous example)
    ?>

    Reason:
    Y is year from the date
    o is ISO-8601 year number
    W is ISO-8601 week number of year

    Conclusion:
    if using 'W' for the week number use 'o' for the year.
    ```
    EricFuture
        66
    EricFuture  
       2019-12-31 10:10:31 +08:00
    一直用的 yyyy,没想到还有这个 bug,get 了,那么问题来了 YYYY 存在的意义是什么呢?
    JamesR
        67
    JamesR  
       2019-12-31 10:10:53 +08:00
    关键是有 Bug 价羊毛可薅吗?
    zsdroid
        68
    zsdroid  
       2019-12-31 10:11:56 +08:00
    YYYY 是表示:当天所在的周属于的年份,一周从周日开始,周六结束,只要本周跨年,那么这周就算入下一年。
    yujieyu7
        69
    yujieyu7  
       2019-12-31 10:12:22 +08:00
    phper 表示 'Y-m-d' 运行良好
    Martin9
        70
    Martin9  
       2019-12-31 10:12:52 +08:00
    cao,这周末也踩了这个坑。
    zsdroid
        71
    zsdroid  
       2019-12-31 10:24:17 +08:00   2
    我查了下,YYYY 的意义:“YYYY 表示的是以周为基础的年度,会计人员依靠这一点来避免在两个不同的年份之间拆分周数,从而避免公司的工资单。”
    daquandiao2
        72
    daquandiao2  
       2019-12-31 10:26:03 +08:00
    js 呢
    est
        73
    est  
       2019-12-31 10:29:23 +08:00
    看了下这个 week-based year 是 ISO 8601 规定的。
    netChen
        74
    netChen  
       2019-12-31 10:34:21 +08:00
    @ccming 墙都不服,就服您贴出来的这个 BUG
    burnbrid
        75
    burnbrid  
       2019-12-31 10:38:28 +08:00
    这个 BUG 怎么重现?我 jdk6 用 SimpleDateFormat 没问题啊?怎么重现谁教教我?
    wc951
        76
    wc951  
       2019-12-31 10:41:06 +08:00 via Android
    oracle 都是大写不存在这个问题
    xu123456
        77
    xu123456  
       2019-12-31 10:43:58 +08:00
    yyyy-mm-dd HH:mm:ss
    fengdechoulian
        78
    fengdechoulian  
       2019-12-31 11:16:12 +08:00
    你别说我遇到一个更奇葩的问题,ios 不支持 new Date('2019-08-02 18:00:00')这样格式的日期转换,后来改成 new Date('2019/08/02 18:00:00')了,真坑。
    kelololy
        79
    kelololy  
       2019-12-31 11:22:26 +08:00
    丢人了,之前真的没注意这个
    burnbrid
        80
    burnbrid  
       2019-12-31 11:23:06 +08:00
    知道了,这是 JAVA8 日期格式化 SimpleDateFormat 的一个小坑,不算 BUG。jdk6 不支持大写的 Y。
    Date date = new Date();
    SimpleDateFormat dateFormat = new SimpleDateFormat("YYYY-MM-dd");
    sinu
        81
    sinu  
       2019-12-31 11:42:43 +08:00
    之前还真没有注意到,不过一直用的公共的常量,检查了下,还好没问题。感谢提醒。
    wc951
        82
    wc951  
       2019-12-31 11:45:49 +08:00 via Android
    看源码就知道 jdk6 的日期格式化类大小写 y 走的是同一个分支
    shuang
        83
    shuang  
       2019-12-31 11:47:18 +08:00
    iugo
        84
    iugo  
       2019-12-31 11:49:52 +08:00
    Javascript 用 getFullYear() 方法.

    moment 让我们用 `YYYY `.
    iugo
        85
    iugo  
       2019-12-31 12:12:47 +08:00
    stone520
        86
    stone520  
       2019-12-31 12:30:42 +08:00
    @fengdechoulian 开发小程序同遇到过
    jorneyr
        87
    jorneyr  
       2019-12-31 12:39:22 +08:00
    没问题,都是输出 2019-12-31

    ```java
    import java.time.LocalDate;
    import java.time.format.DateTimeFormatter;

    public class Test {
    public static void main(String[] args) throws Exception {
    System.out.println(LocalDate.now()); // 2019-12-31
    System.out.println(DateTimeFormatter.ofPattern("yyyy-MM-dd").format(LocalDate.now())); // 2019-12-31
    System.out.println(DateTimeFormatter.ofPattern("YYYY-MM-dd").format(LocalDate.now())); // 2019-12-31
    }
    }
    ```
    dotw2x
        88
    dotw2x  
       2019-12-31 12:43:26 +08:00   1
    嘿嘿 , 完全不担心
    ```csharp
    > DateTime.Now.ToString("yyyy-MM-dd")
    "2019-12-31"
    > DateTime.Now.ToString("YYYY-MM-dd")
    "YYYY-12-31"
    >
    ```
    gclove
        89
    gclove  
       2019-12-31 12:47:17 +08:00
    没懂有什么问题
    hiouyuu
        90
    hiouyuu  
       2019-12-31 12:51:42 +08:00
    week based year 一般是结合周来使用的:
    比如 2019.12.31 对应的周应该是 2020W01,而不是 2019W53
    fhsan
        91
    fhsan  
       2019-12-31 12:55:39 +08:00
    为了照顾前端同学,我更习惯 yyyy/MM/dd HH:mm:ss
    TimeRain
        92
    TimeRain  
       2019-12-31 13:01:16 +08:00 via Android
    时区问题吧,会相差 8 个小时,之前遇到过
    cutlove
        93
    cutlove  
       2019-12-31 13:08:36 +08:00
    厉害了,大小写混用选手留下了惭愧的泪水、学无止境哇
    ddllzz
        94
    ddllzz  
       2019-12-31 13:13:25 +08:00 via Android
    @raysonlu 获取当前是今年的第几周。虽然都是日期相关的,但是和这里讨论的不是同一个 Bug。
    chocotan
        95
    chocotan  
       2019-12-31 13:13:32 +08:00
    一直用 yyyy-MM-dd HH:mm:ss
    suyuyu
        96
    suyuyu  
       2019-12-31 13:15:45 +08:00
    直接给的时间戳,前端同事说你这一串数字是什么东西???
    kakudesu
        97
    kakudesu  
       2019-12-31 13:33:20 +08:00
    卧槽我还是第一次听说
    yalanaika
        98
    yalanaika  
       2019-12-31 14:07:24 +08:00
    delphi FormatDateTime: if Token in ['a'..'z'] then Dec(Token, 32);
    billchenchina
        99
    billchenchina  
       2019-12-31 14:15:48 +08:00
    根据 ISO-8601 和 GB/T 7408-2005,现在已经是 2020 年第一周了

    billchenchina@HP-Pavilion-14-bf048tx:~$ date +%G
    2020
    billchenchina@HP-Pavilion-14-bf048tx:~$ date +%V
    01

    国际标准化组织在 ISO 8601 《数据存储和交换形式信息交换日期和时间的表示方法》中将星期一定为一星期的第一天。中华人民共和国国家标准 GB/T 7408-2005 《数据元和交换格式信息交换日期和时间表示法》和国际标准相同,也以周一为一周的第一天。
    https://zh.wikipedia.org/wiki/%E6%98%9F%E6%9C%9F#%E9%80%B1%E9%A6%96%E9%97%AE%E9%A2%98


    这周是 2019.12.30 - 2020.1.5,2019 年两天,2020 年五天。所以这周是 2020 年(
    fbzl
        100
    fbzl  
       2019-12-31 15:32:36 +08:00
    Objective-C 有同样问题

    网上复制粘贴代码太多
    1  2  
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5176 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 57ms UTC 08:28 PVG 16:28 LAX 00:28 JFK 03:28
    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