PHP中的日期相關函式(一

2021-10-19 03:02:59 字數 4742 閱讀 8378

日期相關的操作函式是我們在日常的工作開發中最常接觸到的功能。當然,大部分同學可能最多用到的就是 date() 、 time() 這兩個函式,我們今天先不講這兩個函式,或許後面的文章也不太會講它們,畢竟太常用了。本身在對手冊文件的學習中,就是要發掘有意思的或者沒有接觸過的一些功能函式,所以我們今天的學習的函式可能是大家都沒怎麼用過的,甚至可能很多大家都沒見過的。

首先就是時區類的乙個物件。它可以幫助我們獲取一些當前時區相關的資訊。

$timezone = new datetimezone('asia/shanghai');

var_dump($timezone);

// object(datetimezone)#1 (2)

在例項化這個 datetimezone 時區類時,需要傳遞乙個時區引數。這裡我們給的就是通用的中國時區的設定,雖說我們的國際標準時區是東八區的北京時間,但在 php 中的時區格式中,我們的時區是以上海為命名的。

這個時區類可以直接獲得當前指定時區的定位資訊,比如 asia/shanghai 的定位資訊就是直接定位到上海市的。

// 時區相關的定位資訊

var_dump($timezone->getlocation());

// array(4)

通過 getlocation() 就可以獲取到時區類的定位資訊,經緯度的查詢結果就是上海市中心,comments 欄位也明確地指出了當前時區是北京時間。

// 時區名稱

var_dump($timezone->getname());

// string(13) "asia/shanghai"

// 相對於 gmt 的時差

var_dump($timezone->getoffset(new datetime('now', $timezone)));

// int(28800)

// 所有時區轉換資訊

var_dump($timezone->gettransitions(time()));

// array(1) 

//   }

getname() 方法獲取的是當前時區的名稱,這個就不用多說了。getoffset() 則是獲取到與國際格林尼治時間(gmt)的差值,也就是與子午線的時間間隔,這裡返回的是秒,轉換成小時後正好就是 8 小時。gettransitions() 函式返回的是所有時區轉換的時間,我測試的時間是早上,返回的 time 字段內容是格林尼治時間,offset 字段返回的也是與gmt時間的差值。gmt時間與utc時間是一致的,我們在日常的學習和工作中如果接觸到了這兩個名詞可以將它們看做是相同的概念。

utc時間的標準叫法是協調世界時間,基於國際原子時間,全世界的國家的標準時間都是以它為標準進行調校的,而gmt的本意是定位為本初子午線的平太陽時,utc也是以這條經線為基準進行時區劃分的。不過,按照嚴格的標準來說,它們並不是完全相等的,具體的內容大家可以自行查閱,但對於我們日常開發來說,完全可以將它們視為等同的東西。

// 包含 dst (夏令時),時差和時區資訊的關聯陣列

var_dump(datetimezone::listabbreviations());

// array(144) 

//       [1]=>

//       array(3) 

//     ……

//     ……

// 包含了所有時區標示符的索引陣列

var_dump(datetimezone::listidentifiers());

// array(426)

從列印的結果可以看出,diff() 物件返回的是乙個 dateinterval 物件。這個就是我們這節的主角了,關於它列印出來的這些屬性內容就不多解釋了,欄位名已經非常直觀了,值就是具體的差值。

$interval = new dateinterval("p2d");

var_dump($interval);

// object(dateinterval)#2 (16)

看到沒有?列印出來的內容和上面用 diff() 方法返回的物件的內容是一致的,但是它的建構函式的引數很奇怪。沒錯,當我們自己去例項化乙個 dateinterval 物件時,需要為它定義它的間隔資訊,這個間隔資訊就是我們通過建構函式的引數傳遞進去的。p2d 的意思就是間隔 2 天,首先必須以乙個 p 為開頭,然後可以有 y、m、d 這些日期內容,如果需要時間內容的話,需要乙個 t 然後再跟上 h、m、s 這些內容。比如 p2y4dt6h8m 表示的就是 2年4天6小時8分鐘 的時間間隔。具體的規則大家還是去看文件中的說明:

$interval = new dateinterval("p2y4dt6h8m");

var_dump($interval);

// object(dateinterval)#5 (16)

我們還可以通過欄位串形式的日期資料返回間隔物件,比如:

// 從日期語句建立時間間隔

var_dump(dateinterval::createfromdatestring('2 days'));

// object(dateinterval)#3 (16)

此外,在獲得物件後進行輸出的時候,dateinterval 物件也為我們提供了乙個 format() 方法,可以像 printf() 函式一樣來格式化地輸出日期資訊,而且這裡用的格式符還是日期的格式符。

var_dump($interval->format('%y %d %h %i'));

// string(7) "2 4 6 8"

輸出的內容其實就是屬性中對應的那些日期和時間差值。

說完時間間隔了,我們再來看看時間週期。時間週期是個什麼概念呢?就比如說我們要每三天間隔一次地獲取日期,這時就可以用時間週期相關的類來進行處理。

$start = new datetime('2020-09-01');

$interval = new dateinterval('p7d');

$end = new datetime('2020-09-30');

$daterange = new dateperiod($start, $interval ,$end);

var_dump($daterange);

// object(dateperiod)#7 (6) 

//     ["current"]=>

//     null

//     ["end"]=>

//     object(datetime)#9 (3) 

//     ["interval"]=>

//     object(dateinterval)#10 (16) 

//     ["recurrences"]=>

//     int(1)

//     ["include_start_date"]=>

//     bool(true)

//   }

foreach($daterange as $date)

// 20200901

// 20200908

// 20200915

// 20200922

// 20200929

首先設定了開始時間和結束時間以及乙個時間間隔物件,然後用它們做為引數來生成乙個 dateperiod 時間週期物件。它是乙個實現了迭代器的物件,所以我們可以直接遍歷它,結果就是以 p7d ,也就是 7 天為間隔的一組日期資料。

var_dump($daterange->getdateinterval());

// object(dateinterval)#11 (16) 

var_dump($daterange->getstartdate());

// object(datetime)#11 (3) 

var_dump($daterange->getenddate());

// object(datetime)#11 (3)

它的這一堆方法其實返回的就是我們定義的那些構造引數資訊。另外,它還可以指定從開始日期往後按照時間間隔返回幾條資訊。

$period = new dateperiod($start, $interval, 4);

foreach($period as $date)

// 20200901

// 20200908

// 20200915

// 20200922

// 20200929

var_dump($period->getrecurrences());

// int(4)

recurrences 引數的作用就是按照指定的時間間隔返回幾條資訊,這裡我們是返回 9月1號 之後每次間隔 7 天的 4 條資訊,和上面的內容一樣。這時我們修改建構函式的值為其它數量,比如修改為 2 ,那麼就只會返回到 9月15號 的資訊了。它不會受到結束日期的約束,可以返回從開始日期到指定數量之後的所有資訊,大家可以自己嘗試一下。

今天學習的內容不知道大家有沒有接觸過,反正我是只用過 diff() 方法來處理過日期之間的差值問題,而且也並沒有注意到過它返回的這個物件具體的內容。而另外兩個物件則是壓根沒有印象,完全就是沒聽說過的感覺。所以說,平常多刷刷手冊還是非常有幫助的,今天學習的內容又讓我們知道了很多東西,而且 dateperiod 在具體的業務實現中是肯定會有使用場景的。學習不止,後面我們要學習的內容依然精彩。

測試**:

中的日期相關函式(一).php

PHP日期與時間相關的函式

php日期和時間 1.驗證日期。checkdate 如果提供的日期有效,返回true,否則返回false。bool bheckdate int month,int day,int year 2.格式化日期。date 函式返回根據預定義的格式制定的指令格式化的時間和日期的字串形式。string dat...

Oracle中的日期相關函式 部分

select to char sysdate,yyyy mm dd hh24 mi ss as nowtime from dual 獲取時間的年 select to char sysdate,yyyy as nowyear from dual 獲取時間的月 select to char sysdat...

golang中時間和日期相關的簡單函式一

擼 擼 有注釋有注釋 func main fmt.println 5 time的unix和unixnano方法 func t time unix int64 表示從時間點january 1,1970 utc到時間點t所經歷的時間 單位秒 func t time unixnano int64 表示從時...