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類庫提供了直觀而且高效的方法來執行復雜的日期計算,如果您正在尋找一種在不同位置轉換時間戳的簡便方法,那么我熱忱地向您推薦這種方法。
新聞熱點
疑難解答