我正在编写我的第一个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查询中直接管理它?
或者你能否提出其他更优雅的方法来管理它?
答案 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 @@ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^ 强>
此类可根据需要使用