php y-m-d分割,PHP-错误的日期对话(从Y到Y-m-d H:i:s)

我的代码返回了错误的日期对话

$date = '8312015';

$newDate = DateTime::createFromFormat('ndY', $date);

$convertedDate = $newDate->format('Y-m-d H:i:s');

echo $convertedDate;

退货

0021-11-12 17:04:56

期望:

2015-08-31 00:00:00

问题:

>为什么PHP无法将ndY转换为Y-m-d H:i:s

>为什么PHP会附加当前时间,而不是00:00:00

注意:我尝试使用date(),date_create,date_format并得到相同的结果(错误的日期)

解决方法:

很近! m实际上是:

Numeric representation of a month, with leading zeros 01 through 12

因此,这意味着它期望是2个字符,而不是1个字符.如果你这样做

$date = '08312015';

$newDate = DateTime::createFromFormat('ndY', $date);

它可以按您想要的方式工作

当你做

$date = '8312015';

$newDate = DateTime::createFromFormat('ndY', $date);

您得到month = 83,day = 12,year = 015

83个月是6年11个月

因此,015 6 = 21年11个月= 21年11月11日,即(0021-11-12),它与输出匹配

编辑:显然,您的意思是n不是m,问题是您在日期部分之间没有定界符,因此,正如已经说过的那样,月是8还是83是不明确的…

重新编辑我的“答案”只是说明了我猜到的问题,没有显示如何解决它,所以…

如果没有通过分隔字符(如-)或字段长度(即m始终是2个字符)来分隔字段,则转换将不明确.假设php认为83是一个有效月份,并且格式化为n的月份可能具有1个或多个数字,所以当php看到83时,它真的不知道您的意思是“第8个月,然后以3开头的东西”还是“第83个月”.

因此,您需要做的是消除定界.一种消除歧义的方法是在左侧填充0,因为d(以及所有意图和目的Y)始终是相同数量的数字(分别为2和4).

因此,$date = str_pad($date,8,“ 0”,STR_PAD_LEFT);会转

8312015转换为08312015,然后可以使用m而不是n进行格式化,然后从那里开始就可以了.几个月> 9,它不会更改输入字符串,因此对于该ndY格式的所有字符串都是安全的.

标签:date-conversion,php,date

来源: https://codeday.me/bug/20191119/2037507.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值