• 请不要在回答技术问题时复制粘贴 AI 生成的内容
zhuzhiqiang
V2EX  ›  程序员

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

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

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

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

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

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

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

    网上复制粘贴代码太多
    1  2  
    ❮ ❯
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   3197 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 229ms · UTC 11:10 · PVG 19:10 · LAX 03:10 · JFK 06:10
    ♥ Do have faith in what you're doing.