Joomla封裝了JDate類(lèi)來(lái)處理日期時(shí)間,這個(gè)類(lèi)擴(kuò)展自PHP的DateTime類(lèi)。JDate類(lèi)允許開(kāi)發(fā)者格式化日期,MySQL交互,UNIX時(shí)間戳計(jì)算,還提供不同時(shí)區(qū)的轉(zhuǎn)換方法。
關(guān)于JDate的類(lèi)名稱(chēng)說(shuō)明
在J3.x后,JDate類(lèi)已經(jīng)使用命名空間的方式進(jìn)行了重新的定義。為了保持兼容,Joomla對(duì)很多的類(lèi)都提供了別名,JDate,JApplication等等類(lèi)似的類(lèi)名實(shí)際上是命名空間類(lèi)的一個(gè)別名。我們建議在開(kāi)發(fā)中使用命名空間的方式來(lái)使用這些類(lèi),這樣在一些代碼編輯器中會(huì)有更好的代碼提示和檢驗(yàn),以便改善開(kāi)發(fā)體驗(yàn),從而減少出錯(cuò)。
關(guān)于系統(tǒng)中其他的別名類(lèi),可以參考這篇文章 Joomla類(lèi)別名映射表。
創(chuàng)建一個(gè)Date的實(shí)例
在使用JDate類(lèi)之前,我們需要獲得一個(gè)JDate實(shí)例。系統(tǒng)提供以下幾種方式來(lái)獲得一個(gè)Date實(shí)例。
使用new方法,代碼如下:
use Joomla\CMS\Date\Date;
$date = new Date(); // 使用當(dāng)前的日期時(shí)間創(chuàng)建一個(gè)date對(duì)象
|
使用Date類(lèi)的靜態(tài)方法來(lái)獲得一個(gè)實(shí)例,代碼如下:
use Joomla\CMS\Date\Date;
$date = Date::getInstance(); // 是 'new Date();'的一個(gè)別名
|
使用工廠(chǎng)方法,代碼如下:
use Joomla\CMS\Factory;
$date = Factory::getDate();
|
參數(shù)說(shuō)明
通過(guò)構(gòu)造器方法和getInstance方法獲得Date對(duì)象的時(shí)候,允許我們提供兩個(gè)可選參數(shù) 。一個(gè)是日期字符串,另外一個(gè)是時(shí)區(qū)。如果不傳遞參數(shù),默認(rèn)會(huì)使用當(dāng)前的日期和時(shí)間作為第一個(gè)參數(shù),用戶(hù)的時(shí)區(qū)設(shè)置作為第二個(gè)參數(shù)。
如果要使用第一個(gè)參數(shù),那么這個(gè)參數(shù)應(yīng)該能被PHP的DateTime構(gòu)造方法支持。典型的用法如下:
use Joomla\CMS\Date\Date;
$currentTime = new Date('now'); // 當(dāng)前的日期時(shí)間
$tomorrowTime = new Date('now +1 day'); // 當(dāng)前的時(shí)間, + 1 天
$plus1MonthTime = new Date('now +1 month'); // 當(dāng)前時(shí)間, + 1 月
$plus1YearTime = new Date('now +1 year'); // 當(dāng)前時(shí)間, + 1 年.
$plus1YearAnd1MonthTime = new Date('now +1 year +1 month'); // 當(dāng)前時(shí)間, + 1年1月
$plusTimeToTime = new Date('now +1 hour +30 minutes +3 seconds'); // 當(dāng)前時(shí)間, + 1 小時(shí)30分3秒
$combinedTimeToTime = new Date('now -1 hour -30 minutes 23 seconds'); // 當(dāng)前時(shí)間, - 1 小時(shí), +30分鐘 +23 秒
$date = new Date('2012-12-1 15:20:00'); // 3:20 PM, December 1st, 2012
|
另外,我們也可以使用一個(gè)Unix時(shí)間戳(以秒為單位)作為第一個(gè)參數(shù),系統(tǒng)會(huì)自動(dòng)將它轉(zhuǎn)換為時(shí)間,如果指定了時(shí)區(qū),那么在轉(zhuǎn)換的時(shí)候會(huì)基于給定的時(shí)區(qū)進(jìn)行重轉(zhuǎn)。
輸出時(shí)間
在輸出日期的時(shí)候,我們一般不建議直接輸出。因?yàn)槟J(rèn)情況下Date對(duì)象的toString()方法并沒(méi)有考慮時(shí)區(qū)和本地化的日期格式問(wèn)題,這樣會(huì)造成不好的用戶(hù)體驗(yàn),更糟糕的情況可能導(dǎo)致不同地方輸出的時(shí)間不一致。因此,在輸出的時(shí)候請(qǐng)使用下面的方法來(lái)輸出,
通用的日期格式
Joomla在語(yǔ)言包中預(yù)定義了一些常用的日期格式,這樣做的一個(gè)好處就是能夠支持多語(yǔ)言。常用的格式字符串如下:
DATE_FORMAT_LC="l, d F Y"
DATE_FORMAT_LC1="l, d F Y"
DATE_FORMAT_LC2="l, d F Y H:i"
DATE_FORMAT_LC3="d F Y"
DATE_FORMAT_LC4="Y-m-d"
DATE_FORMAT_LC5="Y-m-d H:i"
DATE_FORMAT_LC6="Y-m-d H:i:s"
DATE_FORMAT_JS1="y-m-d"
DATE_FORMAT_CALENDAR_DATE="%Y-%m-%d"
DATE_FORMAT_CALENDAR_DATETIME="%Y-%m-%d %H:%M:%S"
DATE_FORMAT_FILTER_DATE="Y-m-d"
DATE_FORMAT_FILTER_DATETIME="Y-m-d H:i:s"
|
為了方便輸出,Joomla提供了HtmlHelper類(lèi)的date方法。 代碼如下:
use Joomla\CMS\HTML\HTMLHelper;
use Joomla\CMS\Language\Text;
$myDateString = '2012-12-1 15:20:00';
echo HtmlHelper::date($myDateString, Text::_('DATE_FORMAT_FILTER_DATETIME'));//默認(rèn)使用當(dāng)前用戶(hù)的時(shí)區(qū)
|
另外,也可以使用Date的format()方法來(lái)輸出。代碼如下:
use Joomla\CMS\Language\Text;
use Joomla\CMS\Date\Date;
use Joomla\CMS\Factory;
$myDateString = '2012-12-1 15:20:00';
$timezone = Factory::getUser()->getTimezone();
$date = new Date($myDateString);
$date->setTimezone($timezone);
echo $date->format(Text::_('DATE_FORMAT_FILTER_DATETIME'));
|
因?yàn)閒ormat方法需要提供時(shí)區(qū)的設(shè)置,此方法對(duì)于格式化用戶(hù)界面外部的日期(例如在系統(tǒng)日志或API調(diào)用中)更有用。
其他的一些有用的代碼示例
修改日期的方法。,代碼如下:
use Joomla\CMS\Date\Date;
$date = new Date('2012-12-1 15:20:00');
$date->modify('+1 year'); //計(jì)算一年之后的日期
echo $date->toSQL(); // 2013-12-01 15:20:00
use Joomla\CMS\Date\Date;
$interval = new \DateInterval('P1Y1D'); // Interval represents 1 year and 1 day
$date1 = new Date('2012-12-1 15:20:00');
$date1->add($interval); //加一年一月
echo $date1->toSQL(); // 2013-12-02 15:20:00
$date2 = new Date('2012-12-1 15:20:00');
$date2->sub($interval);//減一年一月
echo $date2->toSQL(); // 2011-11-30 15:20:00
|
輸出為其他格式的日期方法 ,代碼如下:
// 輸出 ISO 8601 格式
$date = new Date('2012-12-1 15:20:00');
$date->toISO8601(); // 20121201T152000Z
//輸出 RFC 822 格式
$date = new Date('2012-12-1 15:20:00');
$date->toRFC822(); // Sat, 01 Dec 2012 15:20:00 +0000
//輸出 SQL Date-Time 格式
$date = new Date('20121201T152000Z');
$date->toSQL(); // 2012-12-01 15:20:00
//輸出Unix時(shí)間戳 格式
$date = new Date('20121201T152000Z');
$date->toUnix(); // 1354375200
|
更多建議: