管理日期格式PHP和MySQL之间的差异

时间:2009-01-06 01:04:18

标签: php sql mysql datetime

我正在编写我的第一个PHP应用程序,它必须直接处理日期,因此直接处理PHP和MySQL具有不同日期格式的事实。

我的问题是:管理这种差异最优雅的方法是什么?

我有以下两个函数来使用php管理差异:

function mysql_date($php_date)  {
    return date( 'Y-m-d H:i:s', $php_date );
}

function php_date($mysql_date) {
    $val = explode(" ",$mysql_date);
    $date = explode("-",$val[0]);
    $time = explode(":",$val[1]);
    return mktime($time[0],$time[1],$time[2],$date[1],$date[2],$date[0]);
}

有没有一种更简单的方法可以在我的SQL查询中直接管理它?

或者你能否提出其他更优雅的方法来管理它?

7 个答案:

答案 0 :(得分:7)

从PHP(PHP)开始,PHP有一个用于处理日期和时间的内置类/对象,称为DateTime。在一个空白中,使用内置的东西总是比使用杂乱的细节本身更好。

DateTime构造函数(或date_create函数)接受strToTime理解的任何格式的日期。所有你需要了解的关于strToTime的是它的神奇伏都教,它能够以几乎任何字符串格式正确识别日期。当我第一次遇到strToTime时,我现在遇到了同样的内部反应(“那是废话/似乎不可靠”)。不是。它的运作方式是你自己对日期的脆弱理解永远不会(如果你认为你理解日期,你就不会。相信我。)

因此,从MySQL中获取信息作为日期/时间字符串,并立即创建一个PHP日期对象。当/如果您需要将日期再次作为字符串时,请使用date_format方法(带有一些handy constants)。

答案 1 :(得分:3)

您可以将php_date替换为strtotime

$php = strtotime($mysql);

MySQL等效项为UNIX_TIMESTAMP

但是,如果要在SQL中处理格式化,请尝试使用MySQL的DATE_FORMAT

答案 2 :(得分:2)

将数据库中的所有内容存储在UTC的日期时间字段中。对于PHP操作,请使用PEAR Date库。我不是一个庞大的PEAR用户,但这个库非常棒,可以处理所有烦人的日期转换问题,你不应该花时间担心。

答案 3 :(得分:2)

我建议您将所有内容保存为mysql格式,直到需要将其显示给用户,然后使用strtotime()获取unix时间戳,并使用date()对其进行格式化。

如果你输入一些匈牙利表示法,那就更难出错:

$ymdDateAdded = date('Y-m-d');
$timeDateAdded = strtotime($ymdDateAdded);
$userDateadded = date('j F Y', $timeDateAdded);

答案 4 :(得分:1)

我认为在数据库字段中存储unix时间戳会更好。当您需要向人类语言显示日期时,您始终可以使用php的date()函数。对于其他一切,只需使用数字时间戳。

答案 5 :(得分:0)

您可以制作一个小日期对象,只需根据需要转换日期

$Date_p = new MagicDate($php_date);
$Date_m = new MagicDate($mysql_date);

$Date_p$Date_m只显示您可以根据需要播种对象。当你想要一个mysql日期时,你会有像这样的代码。实际上它会像$Date那样非常通用。

$query = "UPDATE SET Date='".$Date_p->toMysql()."' "...

反之亦然,当你需要相反时。您可以使用已创建的功能。只需在构造方法中添加“嗅探器”,如:

public function __construct($date)
{
    $phpdate = strtotime($date);
    if($phpdate) 
    {
        $this->phpdate = $phpdate;
        $this->mysqldate = $this->mysql_date($phpdate);
    }
    else
    {
        $this->phpdate = $this->php_date($phpdate);
        $this->mysqldate = $phpdate;
    }
}

抛出一些错误处理以捕获变坏的东西。添加两个日期的getter。这是一个设置它并忘记它的情况。只需在需要时拉出正确的约会。

可能会有一些优化,但这只是告诉你它是如何工作的。

答案 6 :(得分:0)

这是将时间和日期保存为unix时间戳而不是其他格式的最佳方式。

我已经创建了一个类来处理php中的日期和时间。它易于使用且非常有用

<?php
define("NEW_LINE", "</BR>");
class scTimestamp
{
    private $timestamp;
    private $year;
    private $month;
    private $day;
    private $hour;
    private $minute;
    private $second;

    public function __construct() 
    {
        register_shutdown_function(array($this,'__destruct'));
        $this->setTimestamp($_SERVER['REQUEST_TIME']);
    }
    public function __destruct()
    {
        unset($this->timestamp);
        unset($this->year);
        unset($this->month);
        unset($this->day);
        unset($this->hour);
        unset($this->minute);
        unset($this->second);
    }
    private function rebuildTimestampFromDate()
    {
        $this->timestamp=mktime($this->hour,$this->minute,$this->second,$this->month,$this->day,$this->year);
    }
    private function rebuildDateFromTimestamp()
    {
        $this->day=date('j',$this->timestamp);
        $this->month=date('n',$this->timestamp);
        $this->year=date('Y',$this->timestamp);
        $this->hour=date('g',$this->timestamp);
        $this->minute=date('G',$this->timestamp);
        $this->second=date('s',$this->timestamp);       
    }
    public function setTimestamp($tempTimestamp)
    {
        $this->timestamp=$tempTimestamp;     
        $this->rebuildDateFromTimestamp();
    }
    public function getTimestamp()
    {
        return $this->timestamp;    
    }
    public function setYear($tempYear)
    {
        $this->year = $tempYear;
        $this->rebuildTimestampFromDate();
    }
    public function getYear()
    {
        return $this->year;
    }
    public function setMonth($tempMonth)
    {
        $this->month = $tempMonth;
        $this->rebuildTimestampFromDate();
    }
    public function getMonth()
    {
        return $this->month;
    }
    public function setDay($tempDay)
    {
        $this->day=$tempDay;
        $this->rebuildTimestampFromDate();
    }
    public function getDay()
    {
        return $this->day;
    }
    public function setHour($tempHour)
    {
        $this->hour = $tempHour;
        $this->rebuildTimestampFromDate();
    }
    public function getHour()
    {
        return $this->hour;
    }
    public function setMinute($tempMinute)
    {
        $this->minute = $tempMinute;
        $this->rebuildTimestampFromDate();
    }
    public function getMinute()
    {
        return $this->minute;
    }
    public function setSecond($tempSecond)
    {
        $this->second = $tempSecond;
        $this->rebuildTimestampFromDate();
    }
    public function getSecond()
    {
        return $this->second;
    }


    public function getDateDifferenceFromNow()
    {
        return $this->getDateDifferenceFrom($_SERVER['REQUEST_TIME']);
    }
    public function getDateDifferenceFrom($fromDate)
    {
        $return="";
        $sec=" Second";
        $min=" Minute";
        $hrs=" Hour";
        $before=" Before";
        $difference=$fromDate-$this->getTimestamp();
        if($difference<0)
            $return.="In the Future";
        else if($difference<60)
        {
            if($difference>1)
                $sec.="s";
            $return.= $difference.$sec.$before;
        }
        else if($difference<3600)
        {
            $difference=intval($difference/60);
            if($difference>1)
                $min.="s";
            $return.=$difference.$min.$before;
        }
        else if($difference<86400)
        {
            $difference=intval($difference/3600);
            if($difference>1)
                $hrs.="s";
            $return= $difference.$hrs.$before;
        }
        else if($difference<604800)
        {
            $return.= date("l g:i a",$this->getTimestamp());
        }
        else if($difference<28512000)
        {
            $return.= date("F j",$this->getTimestamp());
        }
        else
        {
            $return.= date("F j, Y, g:i a",$this->getTimestamp());
        }
        return $return;
    }
    public function getDateAsString()
    {
        return date("F j, Y",$this->getTimestamp());
    }
    public function getDateTimeAsString()
    {
        return date("F j, Y, g:i a",$this->getTimestamp());
    }


    public function __toString()
    {
        $return = NEW_LINE."^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^";
        $return.= NEW_LINE." ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^".NEW_LINE;
        $return.= NEW_LINE."@@ Timestamp: ".$this->getTimestamp()." @@".NEW_LINE;
        $return.= NEW_LINE."@@ Date: ".$this->getDateTimeAsString()." @@".NEW_LINE;
        $return.= NEW_LINE." ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^".NEW_LINE;
        return $return;
    }

}
?>

一旦包含它,可以按照以下方式使用

include_once("scTimestamp.php");
$test=new scTimestamp();

echo $test->getDateAsString();

$test->setTimestamp(1210203200);

echo $test->getDateDifferenceFromNow();

echo $test;

$test->setTimestamp(121020320022);
echo $test->getYear();

echo $test;

结果就是这样。

2015年6月26日,2008年5月7日,晚上11:33 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^ @@时间戳:1210203200 @@ @@日期:2008年5月7日,晚上11:33 @@@ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^ 5804 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^ @@时间戳:121020320022 @@ @@日期:5804年12月25日,上午3:33 @@ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^

此类可根据需要使用