【问题标题】:Converting birthday in format DDMMMYY to date value in PHP将 DDMMMYY 格式的生日转换为 PHP 中的日期值
【发布时间】:2016-08-03 00:09:14
【问题描述】:

我有一堆以 DDMMMYY 格式存储的生日。我需要将它们转换为日期值,以便将它们存储在数据库中。

有没有简单的方法告诉 strtotime 函数日期必须是过去的?

<?php
$datestring = '22SEP41';
echo date('Y-m-d',strtotime($datestring)); //outputs 2041-09-22, should be 1941-09-22
?>

【问题讨论】:

  • 您希望从$datestring = '22SEP15'; 日期算起是哪一年? 1915 年还是 2015 年?读取字符串的最后 2 个字符,如果它在特定的截断之后,则通过添加 1920 来修改它
  • 如果年份以两位数格式指定,0-69 之间的值映射到 2000-2069,70-100 之间的值映射到 1970-2000。 w3schools.com/php/func_date_strtotime.asp

标签: php time strtotime


【解决方案1】:

仅当标准评估日期在今天之后时,此方法才会创建上世纪的日期:

$date = date_create( $datestring );
if( $date->diff( date_create() )->invert )
{
    $date->modify( '-100 years' );
}
echo $date->format( 'Y-m-d' );

对于

$datestring = '22SEP41';

输出是:

1941-09-22

对于

$datestring = '22SEP01';

输出是:

2001-09-22

eval.in demo

基本上,我们根据给定的字符串创建一个 DateTime,然后我们计算与当前日期的差异;如果差是负数 (-&gt;invert),我们从日期中减去 1 个世纪。

您可以使用-&gt;format('%R%Y') 而不是-&gt;invert 来个性化条件。在这个例子中:

if( $date->diff( date_create() )->format('%R%Y') < 10 )

0005 的日期评估为2000-2005

【讨论】:

    【解决方案2】:
    <?php
    $datestring = '22SEP41';
    
    $matches = [];
    preg_match('/([0-9]{2})([A-Z]{3})([0-9]{2})/', $datestring, $matches);
    
    $prefix = ($matches[3] <= date('y') ? '20' : '19');
    
    $matches[3] = "{$prefix}{$matches[3]}";
    
    $ts = strtotime("{$matches[1]} {$matches[2]} {$matches[3]}");
    
    // date ('Y-m-d', $ts) == 1941-09-22
    

    这假设 22SEP06 应该被解释为 2006 而不是 1906 - 基本上它给出的输出范围是 1917 -> 2016。

    【讨论】:

      【解决方案3】:

      你可以试试这样的:

      $ds = '22SEP41';
      
      $day = $ds[0].$ds[1];
      
      // Getting the month.
      $mon = array(
        'JAN' => 1,
        'FEB' => 2,
        'MAR' => 3,
        'APR' => 4,
        'MAY' => 5,
        'JUN' => 6,
        'JUL' => 7,
        'AUG' => 8,
        'SEP' => 9,
        'OCT' => 10,
        'NOV' => 11,
        'DEC' => 12
      );
      
      $mont = $ds[2].$ds[3].$ds[4];
      $month = $mon[$mont]; // Gets the month real.
      
      $year = '19'.$ds[5].$ds[6];
      
      $final = $day.'-'.$month.'-'.$year;
      

      我在本地机器上对其进行了测试,它工作正常。希望它有效,并且是您正在寻找的东西:)

      【讨论】:

        猜你喜欢
        • 2012-06-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-12
        • 2011-10-11
        • 1970-01-01
        • 2019-12-08
        • 1970-01-01
        相关资源
        最近更新 更多