ASP教程 |PHP教程 |JSP教程 |.net教程 |CGI教程 |XML教程 |AJAX |HTML |网站重构 |CSS教程 |JS教程 |网页设计 |数据库 |服务器 |开发工具 |网站运营
论坛模板 |CMS模板 |产品网页 |商务 |主机网站 |旅游网站 |体育 |娱乐 |艺术网站 |建筑网页 |动植食物 |人物网站 |教育网页 |企业网站 |简约 |另类
编程 |界面设计 |加解密 |浏览阅读 |装机必备 |IIS软件 |FTP软件 |安全软件 |远程监控 |邮件系统 |虚拟主机 |web服务 |组件 |设计软件 |数据库
网站运营 |asp电子书 |PHP电子书 |.net电子书 |JSP电子书 |CGI |数据库XML |服务器 |HTML |设计教程 |AJAX |C语言 |VB |DELPHI |安全 |其它
asp源码 |ASP.NET源码 |PHP源码 |JSP源码 |CGI源码 |FLASH源码 |AJAX源码 |电子商务 |办公OA源码 |公司网站源码 |整站源码
系统 |房屋 |苹果 |文件夹 |电脑 |影视 |动植物 |表情 |系列 |软件 |文件 |游戏 |工具 |CD光盘 |交通 |人物 |食物 |体育 |国旗 |卡通 |标志 |桌面
风景图片 |花草图片 |水资源图片 |动物 | 美食 |人物图片 |抽象 |民族艺术 |静物图片 |宇宙图片 |建筑图片 |装修图片 |科技交通 |体育图片 |精美图片
书法家字体 |迷你 |金梅 |汉仪 |华文 |长城 |创艺 |汉鼎 |金桥 |文鼎 |微软 |超世纪 |中国龙 |四通利方 |华康 |经典 |王汉宗 |中文 |英文 |其它
韩国酷站 |欧美酷站 |中国酷站 |日本酷站 |黑色酷站白色酷站 |灰色酷站 | 红色酷站 |橙色酷站 |黄色酷站 |绿色酷站 |青色酷站 |蓝色酷站 |紫色酷站
广告代码 |导航条 |菜单特效 |日期时间 |背景图像 |图层样式 |鼠标特效 |页面窗口 |色彩表格 |文字特效 |表单按钮 | 计数转换 |游戏特效 |实例特效
网站免费登陆 |Alexa排名查询 |广告代码下载 |站长工具 |查询工具 |技术手册查询 |WHOIS信息查询 |PR值查询 |收录查询 |极品万年历 |身份证查询
当前位置: 牛头网主页电脑学院PHP教程→ 如何使用PHP和PEAR进行不同时区的转换

如何使用PHP和PEAR进行不同时区的转换

来源:     作者:     时间:2008-08-17     点击:
PHP具备一系列日期和时间函数,这为您获取时间信息提供了便利,您可以将这些信息转换为需要的格式并用于计算或者展示给用户。但是如果您想实现一些复杂的功能,事情可能会变得非常复杂。

  一个简单的例子是在网页上显示时间。在PHP中,您可以简单地使用data()函数读取服务器的时钟并以指定的格式进行显示;但是如果您所要显示的时间是不同时区的,比如,您的公司和服务器位于不同的国家,您需要看到的是本地时间而不是当地时间。

  因此,您需要计算出两地的时差,并进行一些计算从而在不同的时区中进行调整,如果时差很重要,您还需要考虑到日期变更、夏令时、月底的最后一天以及闰年的限制等等。

  正如您想像的一样,如果您手动完成这些时区的数学计算,那么这很快就会变成一件很复杂的事情。幸好,PHP内建的时区函数可以帮助解决这一问题,但这些函数并不直观,需要一些时间来熟悉它们的使用。当然,更加快捷的一个选择是使用PEAR的Date类库,它具备对时区的内建支持,而且到目前为止,这是进行时区转换的最简便的方法。

  这篇指南将向您讲解如何使用PEAR的Date类在不同的时区中进行不同的时间数值转换。我假定您已经安装了Apache、PHP以及PEAR的Date类库并且它们都能正常工作。

  注意:您可以直接从互联网上安装PEAR的Date类库,您可以下载或使用它提供的指南进行安装。

  开始

  让我们从基础的初始化和使用Date对象开始讲解,请创建列表A中的PHP代码:

<?php
// include class
include ("Date.php");

// initialize object
$d = new Date("2006-06-21 15:45:27");

// retrieve date
echo $d->getDate();
?>

  这个例子非常简单,它所包含的类代码使用一个日期/时间字符串初始化了一个Date()对象,然后使用getDate()方法来展示您插入的数值,以下是输出的结果:

  2006-06-21 15:45:27

  如何以不同格式来显示日期呢?如果是一个标准格式,比如ISO格式,那只需要向getDate()传递一个修饰符来指明即可,代码如列表B所示:

<?php
// include class
include ("Date.php");

// initialize object
$d = new Date("2006-06-21 15:45:27");

// retrieve date as timestamp
echo $d->getDate(DATE_FORMAT_ISO_BASIC);
?>

    这个例子的输出符合标准的ISO格式。

    20060621T154527Z

  如果需要自己定制的格式,您可以使用format()方法来实现这一点,它和PHP的原有的date()函数一样,format()方法可以接收一系列格式定义符来指明日期每个部分的具体格式。列表C展示了使用format()方法的例子(您可以参考类文档来获取格式定义符的完整列表)。

<?php
// include class
include ("Date.php");

// initialize object
$d = new Date("2006-06-21 15:45:27");

// retrieve date as formatted string
echo $d->format("%A, %d %B %Y %T");
?>

  输出的结果如下:

  Wednesday, 21 June 2006 15:45:27

  时区间进行转换

  现在您已经了解了基本的使用方法,下面让我们来讨论时区的问题,一旦您拥有了初始化的Date()对象,转换时区的工作就可以分为两个简答的步骤:

  使用setTZByID()方法告知Date类从哪个时区进行转换;

  然后,使用convertTZByID()方法告知Date类您所转换的目标时区。

  列表D展示了这部分代码:

<?php
// include class
include ("Date.php");

// initialize object
$d = new Date("2006-06-21 10:36:27");

// set local time zone
$d->setTZByID("GMT");

// convert to foreign time zone
$d->convertTZByID("IST");

// retrieve converted date/time
echo $d->format("%A, %d %B %Y %T");
?>

  在这个例子中,我将格林威治标准时间(GMT)转换为印度标准时间(IST),印度时间比格林威治时间早5.5小时,因此该脚本输出的结果是:

  Wednesday, 21 June 2006 16:06:27

  是不是很简单?以下列表E的例子展示了如果处理闰年和月底日期的问题:

<?php
// include class
include ("Date.php");

// initialize object
$d = new Date("2008-03-01 06:36:27");

// set local time zone
$d->setTZByID("GMT");

// print local time
echo "Local time is " . $d->format("%A, %d %B %Y %T") . "\n";

// convert to foreign time zone
$d->convertTZByID("PST");

// retrieve converted date/time
echo "Destination time is " . $d->format("%A, %d %B %Y %T");
?>

  输出如下:

  Local time is Saturday, 01 March 2008 06:36:27

  Destination time is Friday, 29 February 2008 22:36:27

  注意:您可能会奇怪时区ID是从何而来的,其实,您可以在类文档中找到时区ID的完整列表。

  计算格林威治标准时间位移

  另外一个比较有效的方法是使用格林威治标准时间的位移量来转换时区,也就是利用指定时区和格林威治标准时间之间的差值来进行计算,PEAR的Date类为这一功能提供了便利,通过getRawOffset()方法就可以实现这一点,列表F展示了一个例子。

<?php
// include class
include ("Date.php");

// initialize object
$d = new Date("2006-06-21 10:36:27");

// set local time zone
$d->setTZByID("PST");

// get raw offset from GMT, in msec
echo $d->tz->getRawOffset();
?>

  在此,getRawOffset()方法计算了本地时间和格林威治标准时间的差值,输出结果如下:

  -28800000

  需要注意的是,位移量是以毫秒为单位进行计算的,所以您需要将它除以3600000(每小时中的毫秒数)来获取时区间相差的小时数。

  技巧:您可以使用inDaylightTime()来查看目标时区是否正处于夏令时状态,在类库文档中有关于此方法的详细信息。

  添加和减少时间跨度

  您可以通过Date类库对时间数值执行复杂的日期计算,添加或者减少日期/时间数值,这些持续时间(时间跨度)可以表示为一个包含日、小时、分钟和/或秒的字符串组件,列表G展示了一个简单的例子。

<?php
// include class
include ("Date.php");

// initialize object
$d = new Date("2006-06-21 15:45:27");

// add 01:20 to it
$d->addSpan(new Date_Span("0,1,20,0"));

// retrieve date as formatted string
echo $d->format("%A, %d %B %Y %T");
?>

  在这个例子中,通过调用Date类的addSpan()方法和Date_Span()对象,我向初始的时间戳添加了1小时20分钟,输出结果显而易见:

  Wednesday, 21 June 2006 17:05:27

  和添加时间跨度一样,您可以使用减法,实际上,这就是subtractSpan()方法的目的,列表H展示了此方法的使用方法。

<?php
// include class
include ("Date.php");

// initialize object
$d = new Date("2006-06-21 15:45:27");

// add 01:20 to it
$d->addSpan(new Date_Span("0,1,20,0"));

// subtract 00:05 from it
$d->subtractSpan(new Date_Span("0,0,5,0"));

// retrieve date as formatted string
echo $d->format("%A, %d %B %Y %T");
?>

  在这个例子中,我首先添加了1小时和20分钟,然后又减去了5分钟,最终结果是添加了1小时和15分钟,输出结果如下:

  Wednesday, 21 June 2006 17:00:27

  正如上述的这些例子所展示的,PEAR的Date类库提供了直观而且高效的方法来执行复杂的日期计算,如果您正在寻找一种在不同位置转换时间戳的简便方法,那么我热忱地向您推荐这种方法。

0
顶一下
最新图文
相关文章
最新评论 共有 0 位网友发表了评论  查看所有评论
发表评论
评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
用户名: 密码:   匿名?  注册
牛头网
·
为站长提供最便捷的下载服务
本月热门
最近更新
| 设为首页 | 加入收藏 | 联系站长 | 广告服务 | 诚聘英才 | 网站地图 | RSS订阅 | 建站服务 |