PHP日期格式精度



有人知道是否已经有一种方法可以将日期格式化到一定的精度,而无需我编写一些东西来重建给定的格式吗?

例如,假设我有一个任意格式的日期,但我想使用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:sY-m-d H:iY-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"

此类可以根据需要使用

相关内容

  • 没有找到相关文章

最新更新