如何使用PHP和PEAR進行不同時區的轉換

來源:互聯網
上載者:User

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



相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。