将 DDMMMYY 格式的生日转换为 PHP 中的日期值

Converting birthday in format DDMMMYY to date value in PHP

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

有什么简单的方法可以告诉 strtotime 函数日期必须是过去的日期吗?

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

您可以尝试类似的方法:

$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;

我在我的本地机器上测试过它,它工作正常。希望它有用并且是您正在寻找的:)

<?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。

此方法仅在标准评估日期晚于今天时才创建上个世纪的日期:

$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,然后计算与当天的差异;如果差异为负 (->invert),我们从日期中减去 1 个世纪。

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

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

0005 的日期,评估为 2000-2005