【问题标题】:Format date dd/mm/yyyy to yyyy-mm-dd PHP [duplicate]将日期 dd/mm/yyyy 格式化为 yyyy-mm-dd PHP [重复]
【发布时间】:2013-03-18 13:36:02
【问题描述】:

我有一个以英国格式输入日期的表格,我需要将其转换为

yyyy-mm-dd

例如输入的日期是:31/03/2013,我想将其转换为 '2013-03-31' 以进行数据库插入。

我正在使用以下仅在某些时候奇怪的工作:

$dateInput = $mysqli->real_escape_string($_POST['date']);
$show_date = date('Y-m-d', strtotime($dateInput));

有没有更好的方法来做到这一点?

【问题讨论】:

  • 你为什么要转义日期值......它真的有任何用途吗?
  • 什么时候不能正常工作?此外,转义似乎不是一个好主意(或者至少如果日期格式正确,它似乎没用)。也许您应该考虑使用正则表达式来检查初始格式。
  • @Darren 有时这不起作用的原因是因为 PHP 期望日期为美国格式。如果有的话,您必须重新安排它,然后再将其交给strtotime()stackoverflow.com/questions/4163641/…
  • @Uby 我逃避了一切,所以一些****不会尝试注入
  • @Darren - 在这种情况下是多余的,因为您将字符串转换为日期时间序列化然后再返回 - 您可以控制...如果您认为可以注入某些东西,那么逃逸不会不要完全按照你的想法去做

标签: php date


【解决方案1】:
$date_array = explode("/",$your_date); // split the array
$var_day = $date_array[0]; //day seqment
$var_month = $date_array[1]; //month segment
$var_year = $date_array[2]; //year segment
echo $new_date_format = "$var_year-$var_day-$var_month"; // join them  together

这会起作用

【讨论】:

    【解决方案2】:

    您可能想使用DateTime::createFromFormat

    $show_date = DateTime::createFromFormat('d/m/Y', $dateInput)->format('Y-m-d');
    

    【讨论】:

    • 这个想法很好,但是date_parse_from_format 返回arraydate 接受int 作为第二个输入。
    • 抱歉你已经编辑过了。
    • @Voitcus 是的,我在发布答案后才注意到
    • 注意(这是一个重要的注意事项):仅限 PHP 5.3.0 及更高版本!
    • @Tushar 没关系,现在是 2018 年 :)
    【解决方案3】:

    试试这个:

    $dte  = '28/03/2013';
    $dt   = new DateTime();
    $date = $dt->createFromFormat('d/m/Y', $dte);
    echo $date->format('Y-m-d');
    

    输出:2013-03-28

    【讨论】:

    • 最佳答案,谢谢!
    【解决方案4】:

    几种替代方法。两者都输出 2013-03-31:

    方法 1 - “看,没有功能”

    <?php
        $in = '31/03/2013';
        echo $in[6].$in[7].$in[8].$in[9].'-'.$in[3].$in[4].'-'.$in[0].$in[1];
        ?>    
    

    方法 2 - 正则表达式

    <?php
        echo ($output = preg_replace('!^([0-9]{2})/([0-9]{2})/([0-9]{4})$!',"$3-$2-$1",$input));
    ?>
    

    【讨论】:

      【解决方案5】:

      以下仅在某些时候奇怪地起作用:

      $show_date = date('Y-m-d', strtotime($dateInput));
      

      这是没有其他更短的方法......我一生都在使用它......直到现在还没有注意到任何奇怪的事情......检查是否还有其他事情搞砸了

      其他方法是

      $timestamp = strtotime(str_replace('/', '.', $dateInput));
      $mysql_date = date('Y-m-d', $timestamp); 
      

      【讨论】:

      • 使用斜线时,strtotime() 需要一个美国格式的日期,而不是英国格式的日期,这就是为什么它会搞砸某些值。
      • 我一直想知道 02/03/04 是 2004 年 3 月 2 日、2002 年 3 月 4 日、2004 年 2 月 3 日还是...我认为 PHP 总是采取最后一种可能性,所以这不是什么在输入中给出。
      • @Tushar 谢谢,当我查看它搞砸的日期时,这是有道理的。
      【解决方案6】:

      PHP 5.3 及更高版本

      使用DateTime::createFromFormat. 它允许您指定一个精确的掩码 - 使用 date() 语法 - 来解析传入的字符串日期。

      PHP 5.2 及更低版本

      您必须使用 substr() 手动解析元素(年、月、日、小时、分钟、秒)并将结果交给 mktime(),这将为您构建时间戳。

      【讨论】:

      • 他已经在使用strtotime()
      【解决方案7】:

      试试看。

      $dateInput = explode('/','31/03/2013');
      $ukDate = $dateInput[2].'-'.$dateInput[1].'-'.$dateInput[0];
      

      【讨论】:

      • 打败我。我用 preg_replace(单行)做了一个不同的。
      • 您也可以在没有任何功能的情况下使用字符串数组表示法来执行此操作。
      猜你喜欢
      • 2012-05-05
      • 2016-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多