遇到简单的生日系统问题(PHP / MySQL)

时间:2016-09-08 15:42:50

标签: php

我想知道当数据库中存在冲突的日期系统时会发生什么,当它发生时会导致PHP中的混乱。举个例子,如果你的数据库的一部分包含的日期包含01/01/2016,但在其他一些点包含1/12015,则日期系统似乎会中断。在适当的环境中,我认为它应该是时代的,但在这种情况下它不是。

下面的代码很乱,也许我在想它。但这就是我所拥有的:

    /*
    *
    * Dates ($dob) can appear as followed:
    * 01-30-2016 | 1-30-2016 | 01-01-2016 | 01/30/2016 or any combination
    *
    */

    $chpos = 0;         // Define Character Position Variable
    $replace = false;   // Should we replace the 0 after the first dash?

    // If the date uses this format: 01/02/2016 then replace the / with - so it looks like 01-02-2016
    $dob = preg_replace('/\s+/', '-', $dob);

    // Let's find out if the dash occurs on the 3rd character or 4th. We do this so we can replace the 0 in 2-02-2016
    // 01-34-6789 *String Array positions* 0-23-5678
    if(substr($dob, 0, 3) == 0 && substr($dob, 0, 0) == 0){
        $chpos = 3;
        $replace == true;
    } else if (substr($dob, 0, 0) != 0 && substr($dob, 0, 2) == 0){
        $chpos = 2;
        $replace == true;
    } else {
        $replace == false;
    }

    // Let's replace the 0 after the first dash if necessary
    if($replace == true){
        $dob = substr_replace($dob, '', $chpos);
    }

    // Let's replace the 0 from the beginning if necessary
    if(substr($dob, 0, 1 ) == 0){
       $dob = substr( $dob, 1 );
    }

    // Let's convert it to a usable date object       
    $birthday = new DateTime($dob);

    // Now let's compare the time from now to when the birthdate happened
    $interval = $birthday->diff(new DateTime);

    // Return the data over
    return $interval->y;

代码的问题与它取代左边的0时有关。我可以发誓代码应该工作,但也许我写了一个错字,只是看不到它?我不知道,但根本不工作。消息是:

 Uncaught exception 'Exception' with message 'DateTime::__construct(): Failed to parse time string (2-17-1994) at position 0 (2): Unexpected character'

参考线是: $ birthday = new DateTime($ dob);

我的问题是:

  • 为什么日期系统在有前导零时会中断?

  • 为什么解析日期这么复杂?

  • 我错过了什么或是否应该这么困难?

  • 我是否过度思考?

感谢您的时间!

2 个答案:

答案 0 :(得分:0)

忽略数据清理的问题(dob绝不应该以不同的格式将其放入数据库; unix时间戳应该是更好的选择)...为什么不执行以下操作;

$timedob = strtotime($dob);

$birthday = date('Y-m-d',$timedob);

strtotime接受任何字符串并将其转换为unix时间戳。然后,日期函数将该unix时间戳转换为您想要的输出格式。

请注意,strtotime将输入解释如下;如果月,日,年用斜线分隔' /' - 它假定日期是美国m / d / y格式。如果它看到连字符或句点( - 或。),则假定日期为欧洲d-m-y格式。

答案 1 :(得分:0)

在php中解析一个日期字符串非常容易,它可以使用像strtottime这样的函数来最好地解释你的字符串。 http://php.net/manual/en/function.strtotime.php

您遇到的问题是您应该将数据库中的日期存储为数据库日期或日期时间格式(或者数据库的等效日期)。验证应该在尝试将它们输入数据库之前完成,并且测试任何数据库写入都不会因格式错误的日期结构而被拒绝。转换为输出日期时还应进一步验证。

由于我不得不像你在这里一样手动操作日期字符串已经很长时间了,而且肯定没有必要这样做。特别是因为日期选择器是如此常见,所以在发送之前还将通过js格式化日期浏览器侧。 (当然,这并不需要服务器端验证。)

如果我是你,我会编写一个简短的脚本,将所有日期转换为数据库的正确日期格式,并将该数据库列的格式更改为日期格式。然后解决尝试将字符串作为日期写入应用程序中的数据库的任何地方。在结构良好的应用程序中,这应该只在一个模型函数中完成,所以不应该花太长时间。

正确执行此操作的最终好处是,您现在可以轻松生成报告或查询结果,例如在某个日期之前或之间或两个日期之间或周二等发生的每个事件。