PHP中的日期相關函數(三) https://www.php.net/manual/zh/ref.datetime.php

之前我們已經介紹過了 PHP 的一些相關的日期操作對象,今天我們就來學習剩下的那些面向過程的使用方式。當然,如果是和 DateTime 類中相似的方法我們就不再進行介紹了。另外,Date() 和 time() 這兩個非常常用的函數也不會進行介紹,因爲大家都已經用濫了,所以我們也就不浪費寶貴的學習資源了。

檢查日期

首先,我們先學習一個函數,用來日期是否正確。

var_dump(checkdate(2, 29, 2020)); // bool(true)
var_dump(checkdate(2, 29, 2021)); // bool(false)

2020年是閏年,所以有 2月29號 ,而 2021 年沒有 2月29號 ,這個 checkdate() 函數就是用來檢測給定的日期是否正確。它的參數順序是 月 、 日 、 年,都是必須的參數。

獲取及設置時區

關於時區內容的學習,我們在 DateTimeZone 類的學習中已經詳細的講解過了,在面向過程的方式中,我們也可以通過兩個簡單的函數來獲取和設置當前系統運行環境的時區信息。

var_dump(date_default_timezone_get()); // string(13) "Asia/Shanghai"

var_dump(date("Y-m-d H:i:s")); // string(19) "2020-10-09 08:41:11"

date_default_timezone_set("Asia/Tokyo");

var_dump(date("Y-m-d H:i:s")); // string(19) "2020-10-09 09:41:11"

使用 date_default_timezone_get() 就可以獲取當前系統環境中的時區信息,它是有優先順序的,最優先的是使用 date_default_timezone_set() 設置的時區,然後是 php.ini 文件中所設置的時區信息,最後如果都沒有設置的話,就會根據操作系統的時區設置來確定最終我們運行環境中的時區到底是哪裏。

格式化轉換日期

這裏的轉換日期,其實就是將日期內容輸出爲一個詳細的數組。

print_r(date_parse("2020-12-12 10:00:00.5"));
// Array
// (
//     [year] => 2020
//     [month] => 12
//     [day] => 12
//     [hour] => 10
//     [minute] => 0
//     [second] => 0
//     [fraction] => 0.5
//     [warning_count] => 0
//     [warnings] => Array
//         (
//         )

//     [error_count] => 0
//     [errors] => Array
//         (
//         )

//     [is_localtime] => 
// )

$date = "6.1.2020 13:00+01:00";
print_r(date_parse_from_format("j.n.Y H:iP", $date));
// Array
// (
//     [year] => 2020
//     [month] => 1
//     [day] => 6
//     [hour] => 13
//     [minute] => 0
//     [second] => 0
//     [fraction] => 0
//     [warning_count] => 0
//     [warnings] => Array
//         (
//         )

//     [error_count] => 0
//     [errors] => Array
//         (
//         )

//     [is_localtime] => 1
//     [zone_type] => 1
//     [zone] => 3600
//     [is_dst] => 
// )

date_parse() 與 date_parse_from_format() 都是轉換日期內容爲詳細數組的函數,它們的區別是 date_parse_from_format() 函數可以指定日期和格式,這樣傳遞進來的日期內容就可以是各種格式類型的。它們生成的數組裏面的內容字段名非常清晰,包括年、月、時、分、錯誤信息等內容。

計算太陽起落時間

這個函數就比較有意思了,它可以根據我們指定的一個日期來返回太陽昇起和落下的時間。

$sun_info = date_sun_info(strtotime("2020-12-12"), 113.037211, 28.203167);
foreach ($sun_info as $key => $val) {
    echo "$key: " . date("H:i:s", $val) . "\n";
}

// sunrise: 08:03:54
// sunset: 05:58:14
// transit: 19:01:04
// civil_twilight_begin: 09:58:56
// civil_twilight_end: 04:03:11
// nautical_twilight_begin: 11:20:07
// nautical_twilight_end: 02:42:01
// astronomical_twilight_begin: 12:27:37
// astronomical_twilight_end: 01:34:31

sunrise 就是日出,sunset 就是日落,另外還有 twilight 也就是暮光、黃昏之類的時間,先不管它的準確度如何,這個函數以及與 sun 相關的這些函數都是比較有意思的函數。

獲得日期、時間詳細信息

上面提到過 date_parse() 函數是將標準日期格式轉換爲一個詳細的日期信息數組,在這裏,還有其它的函數也是實現類似的功能,並且內容更加的豐富。

var_dump(getdate());
// array(11) {
//     ["seconds"]=>
//     int(15)
//     ["minutes"]=>
//     int(52)
//     ["hours"]=>
//     int(9)
//     ["mday"]=>
//     int(9)
//     ["wday"]=>
//     int(5)
//     ["mon"]=>
//     int(10)
//     ["year"]=>
//     int(2020)
//     ["yday"]=>
//     int(282)
//     ["weekday"]=>
//     string(6) "Friday"
//     ["month"]=>
//     string(7) "October"
//     [0]=>
//     int(1602204735)
//   }

var_dump(gettimeofday());
// array(4) {
//     ["sec"]=>
//     int(1602205147)
//     ["usec"]=>
//     int(625261)
//     ["minuteswest"]=>
//     int(-540)
//     ["dsttime"]=>
//     int(0)
//   }

var_dump(gettimeofday(true)); // float(1602205147.6253)

getdate() 函數只會返回日期時間的詳細內容,沒有錯誤信息之類的內容,不僅包括年、月、時、分等相關信息,還包含了當前時間的時間戳信息,可以說是真正的完整的日期詳情函數。它可以有一個參數,用來返回指定日期的內容,如果不給這個參數,則返回的是當前日期時間下的信息。gettimeofday() 從名稱就可以看出,它返回的是當前日期的時間戳信息,如果將它的參數設置爲 true ,那麼它和 time() 返回的內容基本是類似的,不過需要注意的是,它返回的內容是包含微秒的哦。後面我們將要看到的 microtime() 是專門用來返回帶微秒的時間戳的函數,它也一樣可以設置參數爲 true 來返回這種數字格式的時間戳,不過大部分人可能都不知道呢。

獲取本地時間詳細信息

$localtime = localtime();
$localtime_assoc = localtime(time(), true);
print_r($localtime);
// Array
// (
//     [0] => 14
//     [1] => 3
//     [2] => 10
//     [3] => 9
//     [4] => 9
//     [5] => 120
//     [6] => 5
//     [7] => 282
//     [8] => 0
// )
print_r($localtime_assoc);
// Array
// (
//     [tm_sec] => 14
//     [tm_min] => 3
//     [tm_hour] => 10
//     [tm_mday] => 9
//     [tm_mon] => 9
//     [tm_year] => 120
//     [tm_wday] => 5
//     [tm_yday] => 282
//     [tm_isdst] => 0
// )

localtime() 函數返回的是本地時間的數組信息,它與 C 函數調用返回的完全一樣,如果將第二個參數設置爲 true 的話,返回的數組鍵就是英文的鍵名形式的內容。可以看出它也是返回的時間信息,同樣地包含年、月、日、時、分、秒這些內容。另外還包括 wday 週中的第幾天,yday 年中的第幾天這些信息。

其它時間函數

var_dump(microtime()); // string(21) "0.38488800 1602205473"

var_dump(microtime(true)); // float(1602205473.3849)

這就是前面講過的 microtime() 函數,在沒有參數的情況下,它返回的內容是 微秒 空格 秒 這種格式的時間戳,加了參數以後就是返回的 秒 . 微秒 這樣的格式。可以明顯地看出,默認情況下它的微秒精度更高一些,當然,具體的需求還是要根據我們的業務情況來定奪到底使用哪種格式,其實如果說要拼接自己的時間戳格式的話,上面說過的 gettimeofday() 可能更方便一些,畢竟它返回的數組中已經爲我們準備好了 sec 和 usec 這兩個字段。這絕對是今天這篇文章最大的驚喜哦,完全可以應用到我們需要微秒單位的一些真實業務場景中。


var_dump(gmdate("Y-m-d H:i:s")); // string(19) "2020-10-09 01:00:20"

var_dump(idate('Y')); // int(2020)

var_dump(mktime(14, 22, 22, 10, 22, 2020)); // int(1603344142)
var_dump(gmmktime(14, 22, 22, 10, 22, 2020)); // int(1603376542)

var_dump(strftime("%C %Y %m %d %R %U")); // string(22) "20 2020 10 09 10:12 40"
var_dump(gmstrftime("%C %Y %m %d %R %U")); // string(22) "20 2020 10 09 01:13 40"

var_dump(strptime("2020-10-09 12:12:12", '%Y-%m-%d %H:%M:%S'));
// array(9) {
//     ["tm_sec"]=>
//     int(12)
//     ["tm_min"]=>
//     int(12)
//     ["tm_hour"]=>
//     int(12)
//     ["tm_mday"]=>
//     int(9)
//     ["tm_mon"]=>
//     int(9)
//     ["tm_year"]=>
//     int(120)
//     ["tm_wday"]=>
//     int(5)
//     ["tm_yday"]=>
//     int(282)
//     ["unparsed"]=>
//     string(0) ""
//   }

gmdate() 獲取的就是格里時間,也就是我們當前時區減少8小時的時區。idate() 函數用於獲取指定的時間信息,比如我們在測試代碼中只獲取當前的年份。

mktime() 獲取的是指定時間的時間戳,同理,gmmktime() 獲取的就是指定時間的格里時間戳。

strftime() 和 gmstrftime() 獲取的是格式化的本地時間日期,帶 gm 開頭的也是格里時間,後面跟的是需要的格式,這個和 DateTime 的 format() 方法是類似的,裏面的參數也是類似的。%C 表示的是世紀,和我們真實對應的世紀需要加1,比如代碼中返回的是 20 ,實際上我們現在是 21 世紀。%R 返回的是 H:i 這個格式,%U 返回的是第幾周。

strptime() 是根據指定格式的日期返回日期的詳細信息數組,和 localtime() 有點類似。

總結

是不是感覺又發現了很多寶藏,今天的學習中我們發現了 gettimeofday() 這個函數也可以返回微秒時間,而且還是數組格式化的,也發現了好玩的可以計算指定日期日出和日落時間的函數。當然,學習只是一方面,首先你要記得在 PHP 中已經提供了這些函數,然後再在實際的業務場景中進行應用,這樣才能說是真正地熟練地掌握了這些內容,別的不多說了,趕緊用起來吧。

測試代碼:

https://github.com/zhangyue0503/dev-blog/blob/master/php/202010/source/1.PHP中的日期相關函數(三).php

參考文檔:

https://www.php.net/manual/zh/ref.datetime.php

各自媒體平臺均可搜索【硬核項目經理】

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章