Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 错误的日期对话(ndY到Y-m-d H:i:s)_Php_Date_Date Conversion - Fatal编程技术网

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
问题:

  • 为什么PHP不能将
    ndY
    转换为
    Y-m-d H:i:s
  • 为什么PHP附加当前小时数,而不是
    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;
    }