3

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

例如,假设我有任何格式的日期,但我想使用 PHP DateTimeFormat 将其转换为 Ymd H:i:s 格式(参见下面 PHP 站点的示例)

    $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,找出缺少的内容,然后对日期格式 'Ymd H:i:s' 进行某种字符串处理以省略我不需要的部分(混乱的字符串格式,因为这种日期格式可以是任何东西)。

如果我已经错过了一个功能,我只是不想重新发明轮子。

塔乔

编辑:为了更清楚,日期格式字符串和 $date 的精度是可变的,所以我不能对格式字符串进行硬编码,在我得到它之前我不会知道 $date 的精度。

4

5 回答 5

0

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"
}
于 2013-02-21T12:16:53.317 回答
0

I think you have to know what format is your 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";
?>
于 2013-02-21T12:18:38.243 回答
0

我不认为这是最有效的方法,但它似乎有效。并且可以对其进行调整以允许不同级别的精度。(我选择了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');
    }
}

当然,这并不允许这个人实际上想要一个恰好是午夜的时间,并且明确地这么说。我不知道你报道那个案子有多重要。

于 2013-02-21T13:12:12.687 回答
0

使用 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

于 2013-02-21T12:44:35.207 回答
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 @@ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

这个类可以根据需要使用

于 2015-06-26T12:41:29.520 回答