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

大家是怎么看待 echo date('Ym', strtotime('next month', strtotime('20150130')) ); 这个问题的,算 bug 还是 unix 遗留下来的'习惯'?

  •  
  •   zyc841584303 · 2015-02-03 16:19:53 +08:00 · 6595 次点击
    这是一个创建于 3583 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我更倾向于201502 而不是201503. 最起码应该报个错什么的。
    13 条回复    2015-02-03 23:45:03 +08:00
    TimeLe
        1
    TimeLe  
       2015-02-03 16:21:33 +08:00
    2月没有30号,所以自动计算到下一月了~
    lightening
        2
    lightening  
       2015-02-03 16:23:33 +08:00
    我觉得这是 bug。同是 UNIX 环境,Ruby 里:

    Date.new(2015,1,30) + 1.month
    => Sat, 28 Feb 2015
    nilennoct
        3
    nilennoct  
       2015-02-03 16:29:08 +08:00 via iPad
    都说了‘next month’还3月这不是bug是什么?
    Sunyanzi
        4
    Sunyanzi  
       2015-02-03 16:29:45 +08:00
    我不觉得这是个 bug ... php 设计如此 ...

    如果你需要跳二月的话可以用 MySQL 来完成 DATE_ADD( '2015-01-30', INTERVAL 1 MONTH ) ...
    zyc841584303
        5
    zyc841584303  
    OP
       2015-02-03 16:31:12 +08:00
    @lightening 我觉得也是 php 默认 next month +1 month == +31 day
    zyc841584303
        6
    zyc841584303  
    OP
       2015-02-03 16:31:50 +08:00
    @Sunyanzi 不觉得 按照语义来说 next month +1 month 就是指的是2月么
    Sunyanzi
        7
    Sunyanzi  
       2015-02-03 16:42:39 +08:00
    如果你给出的不是一个月末的日期而是永远使用每月第一天的话 +1 month 就永远不会有问题 ...
    lightening
        8
    lightening  
       2015-02-03 16:47:43 +08:00
    @Sunyanzi
    @zyc841584303

    话说楼主可以试试 20150201 + 1 month 会是什么结果
    invite
        9
    invite  
       2015-02-03 19:24:30 +08:00
    那如果 3月31日 来实验,应该是几月了?
    lincanbin
        10
    lincanbin  
       2015-02-03 20:09:11 +08:00
    <?php
    $d = new DateTime( '2015-01-30' );
    $d->modify( 'first day of next month' );
    echo $d->format( 'F' ), "\n";
    ?>
    zyc841584303
        11
    zyc841584303  
    OP
       2015-02-03 20:53:13 +08:00
    @Sunyanzi 每天都会运行的一个脚本,数据库分表来, xxxx_201501_201502 然后前几天出现问题的变成了xxxx_201501_201503。官网上面很早就有这个问题了,一直没管。
    严谨点,推荐10楼的做法echo date('Ym', strtotime('first day of next month', strtotime('20150130')) );
    msg7086
        12
    msg7086  
       2015-02-03 23:40:05 +08:00
    一年的第2个月开始数起的第30天。
    算月份还是用第一天来算吧,用第30天来算,有二义性。
    Delbert
        13
    Delbert  
       2015-02-03 23:45:03 +08:00
    @msg7086 楼主的意思是每天都会进行分表,自然要获取当前时间了。见11楼,所以10楼正解。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5568 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 09:18 · PVG 17:18 · LAX 01:18 · JFK 04:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.