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

时间:2016-04-12 11:41:14

标签: php time strtotime

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

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

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

3 个答案:

答案 0 :(得分:1)

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

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

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

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

0005的日期评估为2000-2005

答案 2 :(得分:0)

您可以尝试以下方式:

dijit.form.Select

我在我的本地机器上进行了测试,但它确实有效。希望它有效并且是您正在寻找的东西:)