有人知道是否已经有一种方法可以将日期格式化到一定的精度,而无需我编写一些东西来重建给定的格式吗?
例如,假设我有一个任意格式的日期,但我想使用PHP DateTimeFormat(参见下面PHP网站的示例)将其转换为Y-m-d H:I:s格式
$date = new DateTime('2000-01-01');
echo $date->format('Y-m-d H:i:s');
Result: 2000-01-01 00:00:00
我真正希望它做的是,如果它从未包含在原始日期中,就不要返回结果中的H:I:s部分。
目前,我唯一能想到的方法是使用date_parse_from_format,找出缺少的内容,然后对日期格式"Y-m-d H:I:s"进行某种字符串处理,以省略我不需要的部分(因为这种日期格式可以是任何东西,所以字符串格式很乱)。
我只是不想重新发明轮子,如果已经有一个功能我错过了。
Ta,Jo
EDIT:为了更清楚,日期格式字符串和$date的精度是可变的,所以我不能硬编码格式字符串,在得到它之前我不会知道$date的准确性。
我想你必须知道你的DATE是什么格式。
<?php
echo 'Current time: ' . date('Y-m-d H:i:s') . "n";
$format = 'Y-m-d';
$date = DateTime::createFromFormat($format, '2009-02-15');
echo "Format: $format; " . $date->format('Y-m-d H:i:s') . "n";
$format = 'Y-m-d H:i:s';
$date = DateTime::createFromFormat($format, '2009-02-15 15:16:17');
echo "Format: $format; " . $date->format('Y-m-d H:i:s') . "n";
$format = 'Y-m-!d H:i:s';
$date = DateTime::createFromFormat($format, '2009-02-15 15:16:17');
echo "Format: $format; " . $date->format('Y-m-d H:i:s') . "n";
$format = '!d';
$date = DateTime::createFromFormat($format, '15');
echo "Format: $format; " . $date->format('Y-m-d H:i:s') . "n";
?>
preg_match是您想要的,特别是:
if(preg_match('/d{4}-d{2}-d{2} d{2}:d{2}:d{2}/',$date)){
//here do the conversion for "Y-m-d H:i:s"
}else{
//here do the conversion for "Y-m-d"
}
使用strtotime将几乎任何日期格式转换为时间戳。从那里,你可以使用date()来设置你想要的格式
更多信息:
http://php.net/manual/en/function.strtotime.php
http://www.php.net/manual/en/function.date.php
编辑:date_parse也可以实现您想要的:
http://www.php.net/manual/en/function.date-parse.php
我不认为这是最有效的方法,但它似乎有效。它可以进行调整,以允许不同级别的精度。(我选择了Y-m-d H:i:s
、Y-m-d H:i
和Y-m-d
。我认为Y-m-d H
不会有帮助,但也许你可能喜欢Y-m-d ha
。如果是这样,添加它就足够容易了。)
<?php
// Output dates at arbitrary precision.
header ('Content-Type: text/plain');
$input = isset($_GET['date']) ? $_GET['date'] : date('Y-m-d');
$date = new DateTime($input);
echo format_date($date);
function format_date($date) {
switch ($date->format('s')) {
case '00':
switch ($date->format('H')) {
case '00':
return $date->format('Y-m-d');
default:
return $date->format('Y-m-d H:i');
}
default:
return $date->format('Y-m-d H:i:s');
}
}
当然,这不允许这个人真的想要一个确切的午夜时间,并明确地说了出来。我不知道你报道这个案子有多重要。
这是将时间和日期保存为unix时间戳而不是其他格式的最佳方式。
我已经创建了一个类来处理php中的日期和时间。它易于使用,非常非常有用
在您的情况下,您可以使用提供的setter设置年、月、日、小时、分钟和秒,而不是扩展公共函数以获得预期格式的日期和时间。
<?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@@"时间戳:121020320022@@@日期:5804年12月25日凌晨3:33"
此类可以根据需要使用