Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在使用PHP更改日期格式之前,请检查日期格式_Php_Date - Fatal编程技术网

在使用PHP更改日期格式之前,请检查日期格式

在使用PHP更改日期格式之前,请检查日期格式,php,date,Php,Date,我正在寻找一种在更改日期格式之前检查日期格式的方法。我的系统允许用户上传数据电子表格,其中一个字段是出生日期 到目前为止,我遇到的最大问题是mm/dd/yyvsmm/dd/yyyy。我已经找到了一个例子来解决这个问题,但我并不总是想这样做 有没有办法检查If语句中的PHP日期格式?我不想依赖计数,因为1/1/1973的数字量与01/01/73的数字量相同,但年份问题仍然会变得一团糟 任何人都知道我如何在操作dateformat之前检查它 那么,我是否可以在SQL insert命令中包含此代码?

我正在寻找一种在更改日期格式之前检查日期格式的方法。我的系统允许用户上传数据电子表格,其中一个字段是出生日期

到目前为止,我遇到的最大问题是
mm/dd/yy
vs
mm/dd/yyyy
。我已经找到了一个例子来解决这个问题,但我并不总是想这样做

有没有办法检查If语句中的
PHP
日期格式?我不想依赖计数,因为
1/1/1973
的数字量与
01/01/73
的数字量相同,但年份问题仍然会变得一团糟


任何人都知道我如何在操作dateformat之前检查它

那么,我是否可以在SQL insert命令中包含此代码?
“$date='01/24/2006';
$date=日期('Y-m-d',标准时间($date));
$sql=“插入表集合日期='$date'

尝试使用。可以解释您的日期字符串。这将使您不再需要条件检查

$date1 = "1/1/1973";
$date2 = "01/01/73";

$dt1 = new DateTime($date1);
$dt2 = new DateTime($date2);

echo $dt1->format("m/d/Y");     // prints as 01/01/1973
echo $dt2->format("m/d/Y");     // prints as 01/01/1973

编辑

对于1970年以下的两位数年份,您可以尝试此方法,但只有当且仅当您当前和未来的数据输入为四位数年份时,此方法才有效。否则,2003年至2069年间出生的人的生日将转换为19xx

注意:我们使用的是2003年,因为OP表明所有新条目将强制使用四位数年份,并且(发布时)13岁以下的人不会使用该软件

$format=“Y”;
如果(!是数字(substr($date,-4))//检查2位年份
{
$yy=substr($date,-2);//获取两位数的年份
$format=“y”;
如果($yy<70&$yy>2)//寻找1903年到1969年
{
$yy+=1900;
//重新生成具有4位年份的日期字符串
$date=substr($date,0,strlen($date)-2)。$yy;
$format=“Y”;
}
}
$delimiters=数组(“/”、“-”、“);//要检查的不同日期分隔符
foreach($delim分隔符)
{
if(strpos($date,$delim)!==false)
{
$dt=DateTime::createFromFormat(“m..$delim.”d..$delim..$format,$date);
}
}
echo$dt->格式(“m/d/Y”);

是否绝对有必要检查格式?您可以使用来操纵日期,而不考虑传入年份格式。你的代码是根据年份是YY还是YYYY来决定的吗?你可以根据“/”来分割,然后检查第三个元素的长度。数据存储为4位数字,我还进行了检查,以确保用户已超过某个年龄。目前,当仅使用strotime并分配YYYY-mm-dd格式时,正在尝试将某些用户填充为20,而不是一年中前2位的19。如果我想把这两位数的年份转换成4,DateTime是如何处理的呢?伙计,我希望这么简单,但它仍然把1969年的两位数年份改为20,而不是19。@Kyle,我现在明白了。这里的问题是重叠。如果某人出生于2015年1月1日,那会怎样?那是2015年还是1915年?你不可能知道。我可以提供一个解决方案来“修复”少于70年的两位数年份,但这不是一个好的解决方案,而且随着我们在未来几年的发展,情况会继续恶化。是的,没错。好在我要的是出生日期。因此,我们100%地知道,任何超过15岁的人都属于19岁,因为2016年还没有人出生。我们还知道,该软件仅适用于在职员工,因此我们可以猜测,没有人在13岁以下使用我们的软件。这意味着我们现在唯一想让它变为20的时间是00,01,02。任何其他日期应为19。如果做得正确,我们可以对其进行编码,使其始终使用13年的间隔。感谢@mjohns615,这是一个良好的开端,但仍然不是我的理想解决方案。我想阅读表单的原因是使用此软件的人不会遵守规则。对于mm/dd/yy,您的解决方案非常好,但是阅读一个格式也可以让我处理mm-dd-yy。@凯尔,好的,让我们再试一次,看看它是否更接近。检查编辑。
$format = "Y";

if(!is_numeric(substr($date, -4)))      // Checks for 2 digit year
{
    $yy = substr($date, -2);            // Gets 2 digit year
    $format = "y";

    if($yy < 70 && $yy > 2)             // Looking for 1903 to 1969 
    {
        $yy += 1900;

        // Rebuild the date string with 4 digit year
        $date = substr($date, 0, strlen($date) - 2) . $yy;
        $format = "Y";
    }
}

$delimiters = array("/", "-", ".");     // Different date delimiters to check

foreach($delimiters as $delim)
{
    if(strpos($date, $delim) !== false)
    {
        $dt = DateTime::createFromFormat("m" . $delim . "d" . $delim . $format, $date);
    }
}

echo $dt->format("m/d/Y");