反转DateTime::createFromFormat / date_create_from_format函数

3

我不小心将字符串转换为错误格式的日期(月份转换为日期)。这是我所做的:

DateTime::createFromFormat('d/m/Y', '12/26/1987')->format("d/m/Y");

所以它输出了错误的日期,从1987年12月26日变成了1989年10月2日,我已经将许多错误的日期保存到数据库中。 是否有任何反向方法或启示可以在转换之前获得原始日期。

提前感谢。


数据库中是否有12/26/198710/02/1989这两个日期? - Matt
数据库中存储的值是错误格式的'10/02/1989'。 - moc4yu
你完全没有关于原日期的任何信息吗?如果没有至少像年份这样的一些信息,我不确定这是否可能。 - Chris Trudeau
我没有任何信息,除了存储在数据库中的错误格式。 - moc4yu
1个回答

1
当您将日期(1-31)转换为月份(1-12)时,会丢失信息,因此根据我的观察,所有格式不正确的日期可能是2-3个其他日期之一。如果您输入其中一个错误的日期,以下代码将打印出其他可能的日期。我认为这就是您能做的全部:
    $date = DateTime::createFromFormat('d/m/Y', '12/26/1987');

    $possible_dates = array();
    $remainder_start = 0;
    $days_in_month = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
    while ($remainder_start <= $days_in_month[intval($date->format("m")])
    {
        $possible_dates[] = DateTime::createFromFormat("m/d/Y", $date->format("d")."/".(intval($date->format("m"))+$remainder_start)."/".(intval($date->format("Y"))-($remainder_start/12)));
        $remainder_start += 12;
    }

    foreach ($possible_dates as $d)
    {
        echo $d->format("m/d/Y")."\n";
    }

这将打印出1989年12月02日 1988年12月14日 1987年12月26日 由于您将日期放在天的位置,因此即使在错误的日期中,您的月份始终是正确的,但您的年份和天数将是几种组合之一。
如果原始日期中的日期是该月的12日或更早,则您的“错误”日期实际上仍然是正确的。

我尝试修改那段代码,但是我无法得到正确的值。 对于缺失的信息,能否从“错误”的日期中提取出来呢? 因为我只有那个错误的日期。 - moc4yu
据我所知,您无法获取原始日期,但是您可以获得一些可能的日期,很抱歉要告诉您。 - Chris Trudeau
那么,获取正确的代码是不可能的吗? 使用不同的输入,我从那段代码中得到了太多的可能性。 - moc4yu
是的,我相信这是不可能的。 - Chris Trudeau
谢谢,这是我得到的最佳答案。 - moc4yu
谢谢 @moc4yu,很抱歉我不能提供更多帮助。 - Chris Trudeau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接