教程栏目

joomla中文网出品的官方教程

Joomla封装了JDate类来处理日期时间,这个类扩展自PHP的DateTime类。JDate类允许开发者格式化日期,MySQL交互,UNIX时间戳计算,还提供不同时区的转换方法。

关于JDate的类名称说明


在J3.x后,JDate类已经使用命名空间的方式进行了重新的定义。为了保持兼容,Joomla对很多的类都提供了别名,JDate,JApplication等等类似的类名实际上是命名空间类的一个别名。我们建议在开发中使用命名空间的方式来使用这些类,这样在一些代码编辑器中会有更好的代码提示和检验,以便改善开发体验,从而减少出错。

关于系统中其他的别名类,可以参考这篇文章 Joomla类别名映射表

创建一个Date的实例


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

作者: 樱木花道

Joomla程序员,从J1.5到J4.x始终都在做Joomla相关开发定制工作,有超过10年行业经验,国内Joomla扩展开发商ZMAX团队的核心成员

作者网站:ZMAX程序人

评论 (0)

  • 最新在前
  • 最佳在前

第3章 处理URL请求参数

第5章 日志

第6章 错误和调试

第10章 缓存

第14章 路由系统