PHP具备一系列日期和时间函数,这为您获取时间信息提供了便利,您可以将这些信息转换为需要的格式并用于计算或者展示给用户。但是如果您想实现一些复杂的功能,事情可能会变得非常复杂。
一个简单的例子是在网页上显示时间。在PHP中,您可以简单地使用data()函数读取服务器的时钟并以指定的格式进行显示;但是如果您所要显示的时间是不同时区的,比如,您的公司和服务器位于不同的国家,您需要看到的是本地时间而不是当地时间。
因此,您需要计算出两地的时差,并进行一些计算从而在不同的时区中进行调整,如果时差很重要,您还需要考虑到日期变更、夏令时、月底的最后一天以及闰年的限制等等。
正如您想像的一样,如果您手动完成这些时区的数学计算,那么这很快就会变成一件很复杂的事情。幸好,PHP内建的时区函数可以帮助解决这一问题,但这些函数并不直观,需要一些时间来熟悉它们的使用。当然,更加快捷的一个选择是使用PEAR的Date类库,它具备对时区的内建支持,而且到目前为止,这是进行时区转换的最简便的方法。
这篇指南将向您讲解如何使用PEAR的Date类在不同的时区中进行不同的时间数值转换。我假定您已经安装了Apache、PHP以及PEAR的Date类库并且它们都能正常工作。
注意:您可以直接从互联网上安装PEAR的Date类库,您可以下载或使用它提供的指南进行安装。
开始
让我们从基础的初始化和使用Date对象开始讲解,请创建列表A中的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所示:
// 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()方法的例子(您可以参考类文档来获取格式定义符的完整列表)。
// 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展示了这部分代码:
// 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的例子展示了如果处理闰年和月底日期的问题:
// include class
include ("Date.php");
// オブジェクトを初期化します
$d = new Date("2008-03-01 06:36:27");
// ローカルタイムゾーンを設定します
$d->; setTZByID("GMT");
// 現地時間を表示します
echo "現地時間は " . $d->format("%A, %d %B %Y %T") 。 "n";
// 外国のタイムゾーンに変換します
$d->convertTZByID("PST");
// 変換された日付/時刻を取得します
echo "宛先時刻は " . $d->format("%A, %d %B %Y %T");
?>
出力は次のとおりです:
現地時間は土曜日、2008 年 3 月 1 日 06:36:27
目的地時間は 2008 年 2 月 29 日金曜日 22:36:27
注: タイムゾーン ID がどこにあるのか疑問に思われるかもしれません。から来ています。実際、タイムゾーン ID の完全なリストはクラスのドキュメントで見つけることができます。
グリニッジ標準時変位を計算する
もう 1 つのより効果的な方法は、グリニッジ標準時変位を使用してタイム ゾーンを変換することです。つまり、指定されたタイム ゾーンとグリニッジ標準時の差を使用することです。 PEAR の Date クラスは、この関数に便利な機能を提供します。これは、getRawOffset() メソッドを通じて実現できます。 // include class$d = new Date("2006 -06-21 10:36:27");
$d->setTZByID("PST");
echo $d->tz->getRawOffset();
?>
$d = new Date("2006 -06-21 15:45:27");
$d->addSpan(new Date_Span("0,1,20,0")) ;
echo $d->format("%A, %d %B %Y %T");
?>
この例では、Date クラスの addSpan() メソッドと Date_Span() オブジェクトを呼び出すことにより、最初のタイムスタンプに 1 時間 20 分を追加しました。出力は明らかです:
Wednesday, 21。 June 2006 17:05:27
タイム スパンの追加と同様に、減算も使用できます。実際、これがsubtractSpan() メソッドの使用方法です。
// include class
include ("Date.php");
// オブジェクトを初期化
// 01:20 を追加します
// そこから 00:05 を減算します
// 日付を取得しますフォーマットされた文字列として
?>
この例では、最初に 1 時間を追加しましたと 20 分を計算し、その後 5 分を減算します。最終結果は 1 時間と 15 分が加算されます。
2006 年 6 月 21 日水曜日 17:00:27
上記の例が示すように、PEAR の Date クラス ライブラリは、複雑な日付計算を実行する直感的かつ効率的な方法を提供します。さまざまな場所のタイムスタンプを変換する簡単な方法を探している場合は、このアプローチをお勧めします。