将 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
基本上,我们根据给定的字符串创建一个DateTime,然后计算与当天的差异;如果差异为负 (->invert
),我们从日期中减去 1 个世纪。
您可以使用 ->format('%R%Y')
而不是 ->invert
来个性化条件。在这个例子中:
if( $date->diff( date_create() )->format('%R%Y') < 10 )
从 00
到 05
的日期,评估为 2000-2005
。
我有一堆以 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
基本上,我们根据给定的字符串创建一个DateTime,然后计算与当天的差异;如果差异为负 (->invert
),我们从日期中减去 1 个世纪。
您可以使用 ->format('%R%Y')
而不是 ->invert
来个性化条件。在这个例子中:
if( $date->diff( date_create() )->format('%R%Y') < 10 )
从 00
到 05
的日期,评估为 2000-2005
。