V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zhuzhiqiang
V2EX  ›  程序员

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

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

    同事之前的代码使用 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
    一直用 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 亚麻跌
    0312birdzhang
        45
    0312birdzhang   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
    JAVA8 的 localdate 用的是 uuuu-MM-dd,不知道有没有坑
    oneisall8955
        48
    oneisall8955   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 里没有这个问题吧
    ladypxy
        63
    ladypxy   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 年第一周了

    [email protected]:~$ date +%G
    2020
    [email protected]:~$ 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  
    关于   ·   帮助文档   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2765 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 43ms · UTC 13:16 · PVG 21:16 · LAX 05:16 · JFK 08:16
    ♥ Do have faith in what you're doing.