如何使用PHP和PEAR进行不同时区的转换
2008-05-01 04:58
836 查看
.Pms569{display:none;} PHP具备一系列日期和时间函数,这为您获取时间信息提供了便利,您可以将这些信息转换为需要的格式并用于计算或者展示给用户。但是如果您想实现一些复杂的功能,事情可能会变得非常复杂。
一个简单的例子是在网页上显示时间。在PHP中,您可以简单地使用data()函数读取服务器的时钟并以指定的格式进行显示;但是如果您所要显示的时间是不同时区的,比如,您的公司和服务器位于不同的国家,您需要看到的是本地时间而不是当地时间。
因此,您需要计算出两地的时差,并进行一些计算从而在不同的时区中进行调整,如果时差很重要,您还需要考虑到日期变更、夏令时、月底的最后一天以及闰年的限制等等。
正如您想像的一样,如果您手动完成这些时区的数学计算,那么这很快就会变成一件很复杂的事情。幸好,PHP内建的时区函数可以帮助解决这一问题,但这些函数并不直观,需要一些时间来熟悉它们的使用。当然,更加快捷的一个选择是使用PEAR的Date类库,它具备对时区的内建支持,而且到目前为止,这是进行时区转换的最简便的方法。
这篇指南将向您讲解如何使用PEAR的Date类在不同的时区中进行不同的时间数值转换。我假定您已经安装了Apache、PHP以及PEAR的Date类库并且它们都能正常工作。
注意:您可以直接从互联网上安装PEAR的Date类库,您可以下载或使用它提供的指南进行安装。
开始
让我们从基础的初始化和使用Date对象开始讲解,请创建列表A中的PHP代码:
<?PHP
//includeclass
include("Date.PHP");
//initializeobject
$d=newDate("2006-06-2115:45:27");
//retrievedate
echo$d->getDate();
?>
这个例子非常简单,它所包含的类代码使用一个日期/时间字符串初始化了一个Date()对象,然后使用getDate()方法来展示您插入的数值,以下是输出的结果:
2006-06-2115:45:27
如何以不同格式来显示日期呢?如果是一个标准格式,比如ISO格式,那只需要向getDate()传递一个修饰符来指明即可,代码如列表B所示:
<?PHP
//includeclass
include("Date.PHP");
//initializeobject
$d=newDate("2006-06-2115:45:27");
//retrievedateastimestamp
echo$d->getDate(DATE_FORMAT_ISO_BASIC);
?>
这个例子的输出符合标准的ISO格式。
20060621T154527Z
如果需要自己定制的格式,您可以使用format()方法来实现这一点,它和PHP的原有的date()函数一样,format()方法可以接收一系列格式定义符来指明日期每个部分的具体格式。列表C展示了使用format()方法的例子(您可以参考类文档来获取格式定义符的完整列表)。
<?PHP
//includeclass
include("Date.PHP");
//initializeobject
$d=newDate("2006-06-2115:45:27");
//retrievedateasformattedstring
echo$d->format("%A,%d%B%Y%T");
?>
输出的结果如下:
Wednesday,21June200615:45:27
时区间进行转换
现在您已经了解了基本的使用方法,下面让我们来讨论时区的问题,一旦您拥有了初始化的Date()对象,转换时区的工作就可以分为两个简答的步骤:
使用setTZByID()方法告知Date类从哪个时区进行转换;
然后,使用convertTZByID()方法告知Date类您所转换的目标时区。
列表D展示了这部分代码:
<?PHP
//includeclass
include("Date.PHP");
//initializeobject
$d=newDate("2006-06-2110:36:27");
//setlocaltimezone
$d->setTZByID("GMT");
//converttoforeigntimezone
$d->convertTZByID("IST");
//retrieveconverteddate/time
echo$d->format("%A,%d%B%Y%T");
?>
在这个例子中,我将格林威治标准时间(GMT)转换为印度标准时间(IST),印度时间比格林威治时间早5.5小时,因此该脚本输出的结果是:
Wednesday,21June200616:06:27
是不是很简单?以下列表E的例子展示了如果处理闰年和月底日期的问题:
<?PHP
//includeclass
include("Date.PHP");
//initializeobject
$d=newDate("2008-03-0106:36:27");
//setlocaltimezone
$d->setTZByID("GMT");
//printlocaltime
echo"Localtimeis".$d->format("%A,%d%B%Y%T")."/n";
//converttoforeigntimezone
$d->convertTZByID("PST");
//retrieveconverteddate/time
echo"Destinationtimeis".$d->format("%A,%d%B%Y%T");
?>
输出如下:
LocaltimeisSaturday,01March200806:36:27
DestinationtimeisFriday,29February200822:36:27
注意:您可能会奇怪时区ID是从何而来的,其实,您可以在类文档中找到时区ID的完整列表。
计算格林威治标准时间位移
另外一个比较有效的方法是使用格林威治标准时间的位移量来转换时区,也就是利用指定时区和格林威治标准时间之间的差值来进行计算,PEAR的Date类为这一功能提供了便利,通过getRawOffset()方法就可以实现这一点,列表F展示了一个例子。
<?PHP
//includeclass
include("Date.PHP");
//initializeobject
$d=newDate("2006-06-2110:36:27");
//setlocaltimezone
$d->setTZByID("PST");
//getrawoffsetfromGMT,inmsec
echo$d->tz->getRawOffset();
?>
在此,getRawOffset()方法计算了本地时间和格林威治标准时间的差值,输出结果如下:
-28800000
需要注意的是,位移量是以毫秒为单位进行计算的,所以您需要将它除以3600000(每小时中的毫秒数)来获取时区间相差的小时数。
技巧:您可以使用inDaylightTime()来查看目标时区是否正处于夏令时状态,在类库文档中有关于此方法的详细信息。
添加和减少时间跨度
您可以通过Date类库对时间数值执行复杂的日期计算,添加或者减少日期/时间数值,这些持续时间(时间跨度)可以表示为一个包含日、小时、分钟和/或秒的字符串组件,列表G展示了一个简单的例子。
<?PHP
//includeclass
include("Date.PHP");
//initializeobject
$d=newDate("2006-06-2115:45:27");
//add01:20toit
$d->addSpan(newDate_Span("0,1,20,0"));
//retrievedateasformattedstring
echo$d->format("%A,%d%B%Y%T");
?>
在这个例子中,通过调用Date类的addSpan()方法和Date_Span()对象,我向初始的时间戳添加了1小时20分钟,输出结果显而易见:
Wednesday,21June200617:05:27
和添加时间跨度一样,您可以使用减法,实际上,这就是subtractSpan()方法的目的,列表H展示了此方法的使用方法。
<?PHP
//includeclass
include("Date.PHP");
//initializeobject
$d=newDate("2006-06-2115:45:27");
//add01:20toit
$d->addSpan(newDate_Span("0,1,20,0"));
//subtract00:05fromit
$d->subtractSpan(newDate_Span("0,0,5,0"));
//retrievedateasformattedstring
echo$d->format("%A,%d%B%Y%T");
?>
在这个例子中,我首先添加了1小时和20分钟,然后又减去了5分钟,最终结果是添加了1小时和15分钟,输出结果如下:
Wednesday,21June200617:00:27
正如上述的这些例子所展示的,PEAR的Date类库提供了直观而且高效的方法来执行复杂的日期计算,如果您正在寻找一种在不同位置转换时间戳的简便方法,那么我热忱地向您推荐这种方法。
一个简单的例子是在网页上显示时间。在PHP中,您可以简单地使用data()函数读取服务器的时钟并以指定的格式进行显示;但是如果您所要显示的时间是不同时区的,比如,您的公司和服务器位于不同的国家,您需要看到的是本地时间而不是当地时间。
因此,您需要计算出两地的时差,并进行一些计算从而在不同的时区中进行调整,如果时差很重要,您还需要考虑到日期变更、夏令时、月底的最后一天以及闰年的限制等等。
正如您想像的一样,如果您手动完成这些时区的数学计算,那么这很快就会变成一件很复杂的事情。幸好,PHP内建的时区函数可以帮助解决这一问题,但这些函数并不直观,需要一些时间来熟悉它们的使用。当然,更加快捷的一个选择是使用PEAR的Date类库,它具备对时区的内建支持,而且到目前为止,这是进行时区转换的最简便的方法。
这篇指南将向您讲解如何使用PEAR的Date类在不同的时区中进行不同的时间数值转换。我假定您已经安装了Apache、PHP以及PEAR的Date类库并且它们都能正常工作。
注意:您可以直接从互联网上安装PEAR的Date类库,您可以下载或使用它提供的指南进行安装。
开始
让我们从基础的初始化和使用Date对象开始讲解,请创建列表A中的PHP代码:
<?PHP
//includeclass
include("Date.PHP");
//initializeobject
$d=newDate("2006-06-2115:45:27");
//retrievedate
echo$d->getDate();
?>
这个例子非常简单,它所包含的类代码使用一个日期/时间字符串初始化了一个Date()对象,然后使用getDate()方法来展示您插入的数值,以下是输出的结果:
2006-06-2115:45:27
如何以不同格式来显示日期呢?如果是一个标准格式,比如ISO格式,那只需要向getDate()传递一个修饰符来指明即可,代码如列表B所示:
<?PHP
//includeclass
include("Date.PHP");
//initializeobject
$d=newDate("2006-06-2115:45:27");
//retrievedateastimestamp
echo$d->getDate(DATE_FORMAT_ISO_BASIC);
?>
这个例子的输出符合标准的ISO格式。
20060621T154527Z
如果需要自己定制的格式,您可以使用format()方法来实现这一点,它和PHP的原有的date()函数一样,format()方法可以接收一系列格式定义符来指明日期每个部分的具体格式。列表C展示了使用format()方法的例子(您可以参考类文档来获取格式定义符的完整列表)。
<?PHP
//includeclass
include("Date.PHP");
//initializeobject
$d=newDate("2006-06-2115:45:27");
//retrievedateasformattedstring
echo$d->format("%A,%d%B%Y%T");
?>
输出的结果如下:
Wednesday,21June200615:45:27
时区间进行转换
现在您已经了解了基本的使用方法,下面让我们来讨论时区的问题,一旦您拥有了初始化的Date()对象,转换时区的工作就可以分为两个简答的步骤:
使用setTZByID()方法告知Date类从哪个时区进行转换;
然后,使用convertTZByID()方法告知Date类您所转换的目标时区。
列表D展示了这部分代码:
<?PHP
//includeclass
include("Date.PHP");
//initializeobject
$d=newDate("2006-06-2110:36:27");
//setlocaltimezone
$d->setTZByID("GMT");
//converttoforeigntimezone
$d->convertTZByID("IST");
//retrieveconverteddate/time
echo$d->format("%A,%d%B%Y%T");
?>
在这个例子中,我将格林威治标准时间(GMT)转换为印度标准时间(IST),印度时间比格林威治时间早5.5小时,因此该脚本输出的结果是:
Wednesday,21June200616:06:27
是不是很简单?以下列表E的例子展示了如果处理闰年和月底日期的问题:
<?PHP
//includeclass
include("Date.PHP");
//initializeobject
$d=newDate("2008-03-0106:36:27");
//setlocaltimezone
$d->setTZByID("GMT");
//printlocaltime
echo"Localtimeis".$d->format("%A,%d%B%Y%T")."/n";
//converttoforeigntimezone
$d->convertTZByID("PST");
//retrieveconverteddate/time
echo"Destinationtimeis".$d->format("%A,%d%B%Y%T");
?>
输出如下:
LocaltimeisSaturday,01March200806:36:27
DestinationtimeisFriday,29February200822:36:27
注意:您可能会奇怪时区ID是从何而来的,其实,您可以在类文档中找到时区ID的完整列表。
计算格林威治标准时间位移
另外一个比较有效的方法是使用格林威治标准时间的位移量来转换时区,也就是利用指定时区和格林威治标准时间之间的差值来进行计算,PEAR的Date类为这一功能提供了便利,通过getRawOffset()方法就可以实现这一点,列表F展示了一个例子。
<?PHP
//includeclass
include("Date.PHP");
//initializeobject
$d=newDate("2006-06-2110:36:27");
//setlocaltimezone
$d->setTZByID("PST");
//getrawoffsetfromGMT,inmsec
echo$d->tz->getRawOffset();
?>
在此,getRawOffset()方法计算了本地时间和格林威治标准时间的差值,输出结果如下:
-28800000
需要注意的是,位移量是以毫秒为单位进行计算的,所以您需要将它除以3600000(每小时中的毫秒数)来获取时区间相差的小时数。
技巧:您可以使用inDaylightTime()来查看目标时区是否正处于夏令时状态,在类库文档中有关于此方法的详细信息。
添加和减少时间跨度
您可以通过Date类库对时间数值执行复杂的日期计算,添加或者减少日期/时间数值,这些持续时间(时间跨度)可以表示为一个包含日、小时、分钟和/或秒的字符串组件,列表G展示了一个简单的例子。
<?PHP
//includeclass
include("Date.PHP");
//initializeobject
$d=newDate("2006-06-2115:45:27");
//add01:20toit
$d->addSpan(newDate_Span("0,1,20,0"));
//retrievedateasformattedstring
echo$d->format("%A,%d%B%Y%T");
?>
在这个例子中,通过调用Date类的addSpan()方法和Date_Span()对象,我向初始的时间戳添加了1小时20分钟,输出结果显而易见:
Wednesday,21June200617:05:27
和添加时间跨度一样,您可以使用减法,实际上,这就是subtractSpan()方法的目的,列表H展示了此方法的使用方法。
<?PHP
//includeclass
include("Date.PHP");
//initializeobject
$d=newDate("2006-06-2115:45:27");
//add01:20toit
$d->addSpan(newDate_Span("0,1,20,0"));
//subtract00:05fromit
$d->subtractSpan(newDate_Span("0,0,5,0"));
//retrievedateasformattedstring
echo$d->format("%A,%d%B%Y%T");
?>
在这个例子中,我首先添加了1小时和20分钟,然后又减去了5分钟,最终结果是添加了1小时和15分钟,输出结果如下:
Wednesday,21June200617:00:27
正如上述的这些例子所展示的,PEAR的Date类库提供了直观而且高效的方法来执行复杂的日期计算,如果您正在寻找一种在不同位置转换时间戳的简便方法,那么我热忱地向您推荐这种方法。
相关文章推荐
- 如何使用SQL语句将行和列进行转换
- 如何在PHP项目中使用phinx进行数据迁移和建表
- 如何将简单CMS后台管理系统示例转换为Java、Php等不同后台语言的版本
- PHP 数组的各种排序 原:如何使用强大的PHP函数对数组进行排序
- PHP中如何使用socket进行通信?
- 如何使用SQL语句将行和列进行转换?
- 如何使用QString把不同类型的数据如何转换成字符串形式输出
- [php-pear]如何使用 PHP-PEAR安装器,以及使用 PEAR 安装扩展库
- PHP - 使用pear的HTTP_Upload包进行上传
- 如何在PHP中使用正则表达式进行查找替换
- 如何将简单CMS后台管理系统示例转换为Java、Php等不同后台语言的版本
- 如何使用PHP对网站验证码进行破解
- 使用万能地图下载器进行坐标转换的时候如何确定平面坐标的选择
- php关于使用iconv(...)函数对字符进行中文转换时,遇到的一个问题
- 如何让Tomcat中的webapp使用不同的时区
- 元旦快乐,阖家团圆,幸福安康.C#重载示例(有问重载该如何选择?在C#中可很方便地在智能感知弹出中选择不同参数列表进行使用;不像C/C++那样,要记住编译器自动选择最佳匹配参数列表的概念)
- 4.如何使用常用的6种方式对数据进行转换(一)
- 如何使用工具进行线上 PHP 性能追踪及分析?
- mac下如何安装不同的php版本以及如何进行切换
- 如何将简单CMS后台管理系统示例转换为Java、Php等不同后台语言的版本