Php 错误的日期对话(ndY到Y-m-d H:i:s)
我的代码返回了错误的日期对话Php 错误的日期对话(ndY到Y-m-d H:i:s),php,date,date-conversion,Php,Date,Date Conversion,我的代码返回了错误的日期对话 <?php $date = '8312015'; $newDate = DateTime::createFromFormat('ndY', $date); $convertedDate = $newDate->format('Y-m-d H:i:s'); echo $convertedDate; 期望: 2015-08-31 00:00:00 问题: 为什么PHP不能将ndY转换为Y-m-d H:i:s 为什么PHP附加当前小时数,而不是00:00:
<?php
$date = '8312015';
$newDate = DateTime::createFromFormat('ndY', $date);
$convertedDate = $newDate->format('Y-m-d H:i:s');
echo $convertedDate;
期望:
2015-08-31 00:00:00
问题:
ndY
转换为Y-m-d H:i:s
00:00:00
注意:我尝试了
date()
,date\u create
,date\u format
,得到了相同的结果(错误的日期)非常接近m实际上是:
月份的数字表示形式,前导零为01到12
()
所以,这意味着它期望它是2个字符,而不是一个。如果你这样做
$date = '08312015';
$newDate = DateTime::createFromFormat('ndY', $date);
它能按你所希望的方式工作
当你这样做的时候
$date = '8312015';
$newDate = DateTime::createFromFormat('ndY', $date);
你得到月=83,日=12,年=015
83个月等于6年+11个月
因此,015+6=21
years+11 months=21年的11月11日,即(0021-11-12
),这与输出相匹配
Edit:很明显,您的意思是n
而不是m
,问题是日期部分之间没有分隔符,因此,正如前面所说,月份应该是8还是83是不明确的
再次编辑我的“答案”只是解释了我猜的问题,没有说明如何解决,所以
如果字段不是由分隔字符(如-
)或字段长度(即m
始终为2个字符)分隔的,则转换不明确。显然,php认为83是一个有效的月份,格式为n
的月份可能有一个或多个数字,当php看到83时,它真的不知道您的意思是“第8个月,然后是以3开头的月份”还是“第83个月”
因此,您需要做的是消除定界的歧义。消除歧义的一种方法是在左侧填充0,因为d
(以及出于所有目的Y
)始终是相同数量的数字(分别为2和4)
所以,$date=str\u pad($date,8,“0”,str\u pad\u左)代码>将打开
8312015转换为08312015,然后您可以使用m
而不是n
进行格式化,您应该可以从那里开始。对于>9个月,它不会更改输入字符串,因此对于该ndY
格式的所有字符串都是安全的。答案是您的输入数据必须标准化。我不知道您使用的标准是什么,但我会假设最后四个字符将始终是一年
现在我不知道的是:一个月的哪一天总是必须是两个字符,或者你能得到像“112015”这样的日期吗?如果是这样,您应该如何处理“1112015”?1月11日还是11月1日
规范化数据非常重要
假设月日始终为两位数,最简单的解决方案是:
if ( strlen($date)<8 ) {
$date = '0'.$date;
}
if(strlen($date)该日期格式不明确。请使用更易于分析的格式。除非指定,否则PHP将返回当前小时数。有关DateTime::createFromFormat()的信息,请参阅手册
了解如何操作。2015年11月15日应该是什么日期?是1月15日还是11月5日?确切地说,没有人能说。应该在1月15日返回吗15@Lea,所以请清理它。如果少于8个字符,请在前面加一个“0”。简单!清除输入不一定会对其进行黑客攻击。OP实际上指定了“n”而不是“m”,但是,是的,它不会知道是什么他指的是第8个月或第83个月。OP应该使用“m”来减少歧义。当我回答这个问题时,这个问题有“m”…后来被编辑为“n”。@chiliNUT所以答案是…你不能转换它?如果小于10,n不能说明这只是一个数字?@LeaTano看到更新,我和Octopus想出了大致相同的解决方案
if ( strlen($date)<8 ) {
$date = '0'.$date;
}