Joomla封装了JDate类来处理日期时间,这个类扩展自PHP的DateTime类。JDate类允许开发者格式化日期,MySQL交互,UNIX时间戳计算,还提供不同时区的转换方法。
在J3.x后,JDate类已经使用命名空间的方式进行了重新的定义。为了保持兼容,Joomla对很多的类都提供了别名,JDate,JApplication等等类似的类名实际上是命名空间类的一个别名。我们建议在开发中使用命名空间的方式来使用这些类,这样在一些代码编辑器中会有更好的代码提示和检验,以便改善开发体验,从而减少出错。
关于系统中其他的别名类,可以参考这篇文章 Joomla类别名映射表。
在使用JDate类之前,我们需要获得一个JDate实例。系统提供以下几种方式来获得一个Date实例。
使用new方法,代码如下:
use Joomla\CMS\Date\Date; $date = new Date(); // 使用当前的日期时间创建一个date对象
使用Date类的静态方法来获得一个实例,代码如下:
use Joomla\CMS\Date\Date; $date = Date::getInstance(); // 是 'new Date();'的一个别名
使用工厂方法,代码如下:
use Joomla\CMS\Factory; $date = Factory::getDate();
通过构造器方法和getInstance方法获得Date对象的时候,允许我们提供两个可选参数 。一个是日期字符串,另外一个是时区。如果不传递参数,默认会使用当前的日期和时间作为第一个参数,用户的时区设置作为第二个参数。
如果要使用第一个参数,那么这个参数应该能被PHP的DateTime构造方法支持。典型的用法如下:
use Joomla\CMS\Date\Date; $currentTime = new Date('now'); // 当前的日期时间 $tomorrowTime = new Date('now +1 day'); // 当前的时间, + 1 天 $plus1MonthTime = new Date('now +1 month'); // 当前时间, + 1 月 $plus1YearTime = new Date('now +1 year'); // 当前时间, + 1 年. $plus1YearAnd1MonthTime = new Date('now +1 year +1 month'); // 当前时间, + 1年1月 $plusTimeToTime = new Date('now +1 hour +30 minutes +3 seconds'); // 当前时间, + 1 小时30分3秒 $combinedTimeToTime = new Date('now -1 hour -30 minutes 23 seconds'); // 当前时间, - 1 小时, +30分钟 +23 秒 $date = new Date('2012-12-1 15:20:00'); // 3:20 PM, December 1st, 2012
另外,我们也可以使用一个Unix时间戳(以秒为单位)作为第一个参数,系统会自动将它转换为时间,如果指定了时区,那么在转换的时候会基于给定的时区进行重转。
在输出日期的时候,我们一般不建议直接输出。因为默认情况下Date对象的toString()方法并没有考虑时区和本地化的日期格式问题,这样会造成不好的用户体验,更糟糕的情况可能导致不同地方输出的时间不一致。因此,在输出的时候请使用下面的方法来输出,
通用的日期格式
Joomla在语言包中预定义了一些常用的日期格式,这样做的一个好处就是能够支持多语言。常用的格式字符串如下:
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类的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'));//默认使用当前用户的时区
另外,也可以使用Date的format()方法来输出。代码如下:
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'));
因为format方法需要提供时区的设置,此方法对于格式化用户界面外部的日期(例如在系统日志或API调用中)更有用。
修改日期的方法。,代码如下:
use Joomla\CMS\Date\Date; $date = new Date('2012-12-1 15:20:00'); $date->modify('+1 year'); //计算一年之后的日期 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时间戳 格式 $date = new Date('20121201T152000Z'); $date->toUnix(); // 1354375200