codecamp

Joomla 日期操作类 JDate

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类别名映射表
Joomla JCache
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

处理URL请求参数

Joomla 错误和调试

Joomla 缓存

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }