V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
zhuzhiqiang
V2EX  ›  程序员

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

  •  1
     
  •   zhuzhiqiang ·
    zhuzhiqiang18 · Dec 30, 2019 · 35402 views
    This topic created in 2310 days ago, the information mentioned may be changed or developed.

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

    Supplement 1  ·  Dec 31, 2019
    get 到这个 BUG 就好 愿各位无 BUG[滑稽]
    114 replies    2020-12-31 15:19:36 +08:00
    1  2  
    GuryYu
        1
    GuryYu  
       Dec 30, 2019
    同遇到😃
    mahogany
        2
    mahogany  
       Dec 30, 2019
    你说的这个同事是不是...
    i36lib
        3
    i36lib  
       Dec 30, 2019
    提了什么 BUG ?
    eve1yb0dy
        4
    eve1yb0dy  
       Dec 30, 2019   ❤️ 1
    <?php date('o-W'); // 跨年查询 BUG 用 o-W 代替 Y-W
    ColoThor
        5
    ColoThor  
       Dec 30, 2019
    黑人问号.jpg
    BenjaminReed
        6
    BenjaminReed  
       Dec 30, 2019
    一不小心就踩坑了 😃
    aliveyang
        7
    aliveyang  
       Dec 30, 2019   ❤️ 1
    黑人问号.jpg
    chendy
        8
    chendy  
       Dec 30, 2019   ❤️ 45
    YYYY 是 week-based-year,今天就已经 2020 年了
    yyyy 还是 2019 年
    wpblank
        9
    wpblank  
       Dec 30, 2019
    哈哈哈哈 我在昨天也遇见了
    annielong
        10
    annielong  
       Dec 30, 2019
    一直用 yyyy-MM-dd
    opengps
        11
    opengps  
       Dec 30, 2019   ❤️ 1
    为了照顾前端同学,我更习惯 yyyy/MM/dd HH:mm:ss
    PerFectTime
        12
    PerFectTime  
       Dec 30, 2019
    Curtion
        13
    Curtion  
       Dec 30, 2019
    我写的 HH:MM::ss。。。。我服了
    beastk
        14
    beastk  
       Dec 30, 2019 via iPhone
    Y-m-d H:i:s 会呗锤吗
    jybox
        15
    jybox  
       Dec 30, 2019
    sheeta
        16
    sheeta  
       Dec 30, 2019
    @beastk PHP 不受影响
    itwhat
        17
    itwhat  
       Dec 30, 2019
    Python 不受影响
    W1angMh
        18
    W1angMh  
       Dec 30, 2019
    java 刚毕业的时候写过 HH:MM:SS 做时分秒转换 被同事笑了好久
    iFlicker
        19
    iFlicker  
       Dec 30, 2019
    试了一下笑死我了
    scalaer
        20
    scalaer  
       Dec 30, 2019
    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  
       Dec 30, 2019
    @iFlicker
    文档清清楚楚写明了:

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

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

    为什么现在才 2019 用 "YYYY" 会返回 2020 ?
    Yvette
        37
    Yvette  
       Dec 31, 2019   ❤️ 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  
       Dec 31, 2019 via Android
    昨天在 Laravel 中用到 Carbon 包的 weekOfYear 方法,返回结果是 1,还以为是 bug,其实标准就是认为昨天是 2020 年第一周。

    看了上面各位说的,感觉自己就是个菜逼。
    EminemW
        39
    EminemW  
       Dec 31, 2019 via iPhone
    @nikoo 按周算年份,其实这一周都算 2020 年
    imycc
        40
    imycc  
       Dec 31, 2019
    还有这么人性化的接口,之前真没想到过。。
    Count0
        41
    Count0  
       Dec 31, 2019
    千年虫再现。
    dangyuluo
        42
    dangyuluo  
       Dec 31, 2019
    @Lax 前几个月是什么 bug ?
    lihongming
        43
    lihongming  
       Dec 31, 2019 via iPhone
    这些人都哪儿学的?我从一开始学日期格式就是小-大-小 大:小:小,也没见开源代码里用过大 Y
    wensonsmith
        44
    wensonsmith  
       Dec 31, 2019 via iPhone   ❤️ 1
    Y-m-d 亚麻跌
    1daydayde
        45
    1daydayde  
       Dec 31, 2019 via iPhone
    吓得我赶紧看了一下
    NSAtools
        46
    NSAtools  
       Dec 31, 2019
    昨天刚填的坑
    xwbz2018
        47
    xwbz2018  
       Dec 31, 2019 via Android
    JAVA8 的 localdate 用的是 uuuu-MM-dd,不知道有没有坑
    itechify
        48
    itechify  
    PRO
       Dec 31, 2019 via Android
    笑死了,去年这个时候用的 YYYY,业务说时间不对我还不信,检查了一波脑壳痛,就这个地方用了大写的 Y
    killergun
        49
    killergun  
       Dec 31, 2019
    C# 没这问题
    May725
        50
    May725  
       Dec 31, 2019 via iPhone
    涨姿势了
    acthtml
        51
    acthtml  
       Dec 31, 2019
    got
    randyo
        52
    randyo  
       Dec 31, 2019 via Android
    还好前端 moment 根本不支持小 y
    xuanbg
        53
    xuanbg  
       Dec 31, 2019
    为啥要写 YYYY ?没有 get 到这个点呢。标准的写法不都是 yyyy-MM-dd 吗
    IMCA1024
        54
    IMCA1024  
       Dec 31, 2019
    一直习惯用 yyyy-MM-dd HH:mm:ss 改一个都不习惯
    sagaxu
        55
    sagaxu  
       Dec 31, 2019 via Android   ❤️ 1
    @xwbz2018 uuuu 和 yyyy 在处理公元前年份时行为不同
    songjiaxin2008
        56
    songjiaxin2008  
       Dec 31, 2019
    golang 没有这个问题
    ```golang
    fmt.Println(time.Now().Format("2006-01-02 15:04:05")) // 2019-12-31 09:25:20
    ```
    Mutoo
        57
    Mutoo  
       Dec 31, 2019
    bobuick
        58
    bobuick  
       Dec 31, 2019
    无敌大坑货。 官方就不应该出现 YYYY 这种算法方式,坑人。
    raysonlu
        59
    raysonlu  
       Dec 31, 2019
    @ddllzz 这是什么函数?不是说 PHP 没有这个 BUG 么?
    JR1024
        60
    JR1024  
       Dec 31, 2019   ❤️ 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  
       Dec 31, 2019   ❤️ 2
    @xwbz2018 #47 u 和 y 的区别主要是公元前的年份,用 y 是正数,需要加个 G 来区分是 AD 还是 BC ;用 u 直接负数代表公元前,但公元前部分+1 才和我们常规记年相等。
    WEBUG
        62
    WEBUG  
       Dec 31, 2019 via Android
    弱弱问一句 sql 里没有这个问题吧
    Dragonish3600
        63
    Dragonish3600  
       Dec 31, 2019 via iPhone
    腾讯都挂了好么
    QQ 嗯生日提醒,明明是 2020 年 1 月,然后非提说日子已经过了
    demo
        64
    demo  
       Dec 31, 2019
    date-fns^2.8.1 的 YYYY 未发现这个问题
    encro
        65
    encro  
       Dec 31, 2019
    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  
       Dec 31, 2019
    一直用的 yyyy,没想到还有这个 bug,get 了,那么问题来了 YYYY 存在的意义是什么呢?
    JamesR
        67
    JamesR  
       Dec 31, 2019
    关键是有 Bug 价羊毛可薅吗?
    zsdroid
        68
    zsdroid  
       Dec 31, 2019
    YYYY 是表示:当天所在的周属于的年份,一周从周日开始,周六结束,只要本周跨年,那么这周就算入下一年。
    yujieyu7
        69
    yujieyu7  
       Dec 31, 2019
    phper 表示 'Y-m-d' 运行良好
    Martin9
        70
    Martin9  
       Dec 31, 2019
    cao,这周末也踩了这个坑。
    zsdroid
        71
    zsdroid  
       Dec 31, 2019   ❤️ 2
    我查了下,YYYY 的意义:“YYYY 表示的是以周为基础的年度,会计人员依靠这一点来避免在两个不同的年份之间拆分周数,从而避免公司的工资单。”
    daquandiao2
        72
    daquandiao2  
       Dec 31, 2019
    js 呢
    est
        73
    est  
       Dec 31, 2019
    看了下这个 week-based year 是 ISO 8601 规定的。
    netChen
        74
    netChen  
       Dec 31, 2019
    @ccming 墙都不服,就服您贴出来的这个 BUG
    burnbrid
        75
    burnbrid  
       Dec 31, 2019
    这个 BUG 怎么重现?我 jdk6 用 SimpleDateFormat 没问题啊?怎么重现谁教教我?
    wc951
        76
    wc951  
       Dec 31, 2019 via Android
    oracle 都是大写不存在这个问题
    xu123456
        77
    xu123456  
       Dec 31, 2019
    yyyy-mm-dd HH:mm:ss
    fengdechoulian
        78
    fengdechoulian  
       Dec 31, 2019
    你别说我遇到一个更奇葩的问题,ios 不支持 new Date('2019-08-02 18:00:00')这样格式的日期转换,后来改成 new Date('2019/08/02 18:00:00')了,真坑。
    kelololy
        79
    kelololy  
       Dec 31, 2019
    丢人了,之前真的没注意这个
    burnbrid
        80
    burnbrid  
       Dec 31, 2019
    知道了,这是 JAVA8 日期格式化 SimpleDateFormat 的一个小坑,不算 BUG。jdk6 不支持大写的 Y。
    Date date = new Date();
    SimpleDateFormat dateFormat = new SimpleDateFormat("YYYY-MM-dd");
    sinu
        81
    sinu  
       Dec 31, 2019
    之前还真没有注意到,不过一直用的公共的常量,检查了下,还好没问题。感谢提醒。
    wc951
        82
    wc951  
       Dec 31, 2019 via Android
    看源码就知道 jdk6 的日期格式化类大小写 y 走的是同一个分支
    iugo
        84
    iugo  
       Dec 31, 2019
    JavaScript 用 getFullYear() 方法.

    moment 让我们用 `YYYY `.
    iugo
        85
    iugo  
       Dec 31, 2019
    stone520
        86
    stone520  
       Dec 31, 2019
    @fengdechoulian 开发小程序同遇到过
    jorneyr
        87
    jorneyr  
       Dec 31, 2019
    没问题,都是输出 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  
       Dec 31, 2019   ❤️ 1
    嘿嘿 , 完全不担心
    ```csharp
    > DateTime.Now.ToString("yyyy-MM-dd")
    "2019-12-31"
    > DateTime.Now.ToString("YYYY-MM-dd")
    "YYYY-12-31"
    >
    ```
    gclove
        89
    gclove  
       Dec 31, 2019
    没懂有什么问题
    hiouyuu
        90
    hiouyuu  
       Dec 31, 2019
    week based year 一般是结合周来使用的:
    比如 2019.12.31 对应的周应该是 2020W01,而不是 2019W53
    fhsan
        91
    fhsan  
       Dec 31, 2019
    为了照顾前端同学,我更习惯 yyyy/MM/dd HH:mm:ss
    TimeRain
        92
    TimeRain  
       Dec 31, 2019 via Android
    时区问题吧,会相差 8 个小时,之前遇到过
    cutlove
        93
    cutlove  
       Dec 31, 2019
    厉害了,大小写混用选手留下了惭愧的泪水、学无止境哇
    ddllzz
        94
    ddllzz  
       Dec 31, 2019 via Android
    @raysonlu 获取当前是今年的第几周。虽然都是日期相关的,但是和这里讨论的不是同一个 Bug。
    chocotan
        95
    chocotan  
       Dec 31, 2019
    一直用 yyyy-MM-dd HH:mm:ss
    suyuyu
        96
    suyuyu  
       Dec 31, 2019
    直接给的时间戳,前端同事说你这一串数字是什么东西???
    kakudesu
        97
    kakudesu  
       Dec 31, 2019
    卧槽我还是第一次听说
    yalanaika
        98
    yalanaika  
       Dec 31, 2019
    delphi FormatDateTime: if Token in ['a'..'z'] then Dec(Token, 32);
    billchenchina
        99
    billchenchina  
       Dec 31, 2019
    根据 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  
       Dec 31, 2019
    Objective-C 有同样问题

    网上复制粘贴代码太多
    1  2  
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3335 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 355ms · UTC 13:08 · PVG 21:08 · LAX 06:08 · JFK 09:08
    ♥ Do have faith in what you're doing.