1. 程式人生 > >PHP強化之05 - 時間 Date/Time

PHP強化之05 - 時間 Date/Time

一、語法

1、簡介

日期和時間資訊在 PHP 內部是以 64 位數字儲存的, 它可以覆蓋當前時間前後 2920 億年的時間,這個範圍之廣,足以滿足現有應用的實際需求。

2、時區的設定

1)修改ini檔案

如:

date.timezone = Asia/Shanghai

2)date_default_timezone_set函式

如:

date_default_timezone_set('America/Los_Angeles');

可以使用函式 date_default_timezone_get()檢視你當前伺服器的預設時區。

3)ini_set函式

ini_set('date.timezone','Asia/Shanghai'); 

3、“2038年問題”

2038年1月19日凌晨3:14:07(UTC)是自1970年1月1日0點後的2147483647秒。2147483647有什麼特殊?它恰好是(2的31次方-1),如果使用32位表示一個有符號整數,這將是可表示的最大整數(第32位用來表示正負號)。

有效的時間戳典型範圍是格林威治時間 1901 年 12 月 13 日 20:45:54 到 2038 年 1 月 19 日 03:14:07。(此範圍符合 32 位有符號整數的最小值和最大值)。不過在 PHP 5.1 之前此範圍在某些系統(如 Windows)中限制為從 1970 年 1 月 1 日到 2038 年 1 月 19 日。

二、常用方法

1、日期格式化

1)date — 格式化一個本地時間/日期

string date ( string $format [, int $timestamp ] )

timestamp 是可選的,預設值為 time()。

format 引數的字串列表:

format字元 說明 返回值例子
d 月份中的第幾天,有前導零的 2 位數字 01 到 31
D 星期中的第幾天,文字表示,3 個字母 Mon 到 Sun
j 月份中的第幾天,沒有前導零 1 到 31
l("L"的小寫字母) 星期幾,完整的文字格式 Sunday 到 Saturday
N ISO-8601 格式數字表示的星期中的第幾天(PHP 5.1.0 新加) 1(表示星期一)到 7(表示星期天)
S 每月天數後面的英文字尾,2 個字元 st,nd,rd 或者 th。可以和 j 一起用
w 星期中的第幾天,數字表示 0(表示星期天)到 6(表示星期六)
z 年份中的第幾天 0 到 365
星期
W ISO-8601 格式年份中的第幾周,每週從星期一開始(PHP 4.1.0 新加的) 例如:42(當年的第 42 周)
F 月份,完整的文字格式,例如 January 或者 March January 到 December
m 數字表示的月份,有前導零 01 到 12
M 三個字母縮寫表示的月份 Jan 到 Dec
n 數字表示的月份,沒有前導零 1 到 12
t 指定的月份有幾天 28 到 31
L 是否為閏年 如果是閏年為 1,否則為 0
o ISO-8601 格式年份數字。這和 Y 的值相同,只除了如果 ISO 的星期數(W)屬於前一年或下一年,則用那一年。(PHP 5.1.0 新加) Examples: 1999 or 2003
Y 4 位數字完整表示的年份 例如:1999 或 2003
y 2 位數字表示的年份 例如:99 或 03
時間
a 小寫的上午和下午值 am 或 pm
A 大寫的上午和下午值 AM 或 PM
B Swatch Internet 標準時 000 到 999
g 小時,12 小時格式,沒有前導零 1 到 12
G 小時,24 小時格式,沒有前導零 0 到 23
h 小時,12 小時格式,有前導零 01 到 12
H 小時,24 小時格式,有前導零 00 到 23
i 有前導零的分鐘數 00 到 59>
s 秒數,有前導零 00 到 59>
u 毫秒 (PHP 5.2.2 新加)。需要注意的是date()函式總是返回 000000 因為它只接受 integer引數, 而 DateTime::format()才支援毫秒。 示例: 654321
時區
e 時區標識(PHP 5.1.0 新加) 例如:UTC,GMT,Atlantic/Azores
I 是否為夏令時 如果是夏令時為 1,否則為 0
O 與格林威治時間相差的小時數 例如:+0200
P 與格林威治時間(GMT)的差別,小時和分鐘之間有冒號分隔(PHP 5.1.3 新加) 例如:+02:00
T 本機所在的時區 例如:EST,MDT(【譯者注】在 Windows 下為完整文字格式,例如"Eastern Standard Time",中文版會顯示"中國標準時間")。
Z 時差偏移量的秒數。UTC 西邊的時區偏移量總是負的,UTC 東邊的時區偏移量總是正的。 -43200 到 43200
完整的日期/時間
c ISO 8601 格式的日期(PHP 5 新加) 2004-02-12T15:19:21+00:00
r RFC 822 格式的日期 例如:Thu, 21 Dec 2000 16:01:07 +0200
U 從 Unix 紀元(January 1 1970 00:00:00 GMT)開始至今的秒數 參見 time()

2)strftime — 根據區域設定格式化本地時間/日期

string strftime ( string $format [, int $timestamp = time() ] )

返回用給定的格式字串對給出的 timestamp 進行格式輸出後的字串。如果沒有給出時間戳則用當前的本地時間。月份和星期幾以及其它和語言有關的字串寫法和用 setlocale() 設定的當前的區域有關。

相關函式:
setlocale() — 設定地區資訊

2、獲取日期詳情

1)getdate — 取得日期/時間資訊

array getdate ([ int $timestamp = time() ] )

返回一個根據 timestamp 得出的包含有日期資訊的關聯陣列 array。如果沒有給出時間戳則認為是當前本地時間。

返回的關聯陣列中的鍵名單元:

鍵名 說明 返回值例子
“seconds” 秒的數字表示 059
“minutes” 分鐘的數字表示 059
“hours” 小時的數字表示 023
“mday” 月份中第幾天的數字表示 131
“wday” 星期中第幾天的數字表示 0 (週日) 到 6 (週六)
“mon” 月份的數字表示 112
“year” 4 位數字表示的完整年份 比如: 19992003
“yday” 一年中第幾天的數字表示 0365
“weekday” 星期幾的完整文字表示 SundaySaturday
“month” 月份的完整文字表示,比如 January 或 March JanuaryDecember
0 自從 Unix 紀元開始至今的秒數,和 time()的返回值以及用於 date()的值類似。 系統相關,典型值為從 -21474836482147483647

例:

$today = getdate();
print_r($today);

//結果如下
Array
(
    [seconds] => 36
    [minutes] => 23
    [hours] => 15
    [mday] => 10
    [wday] => 2
    [mon] => 7
    [year] => 2018
    [yday] => 190
    [weekday] => Tuesday
    [month] => July
    [0] => 1531207416
)

相關函式:
localtime() — 取得本地時間,返回一個關聯陣列

3、取得一個日期的時間戳

1)time — 返回當前的 Unix 時間戳

int time ( void )

返回自從 Unix 紀元(格林威治時間 1970 年 1 月 1 日 00:00:00)到當前時間的秒數。

該函式是php時間函式中使用頻率最高的一個函式,相信大家對它都已經非常瞭解,這裡就不多做介紹了。

相關函式:

microtime() - 返回當前 Unix 時間戳和微秒數

2)strtotime — 將任何字串的日期時間描述解析為 Unix 時間戳

int strtotime ( string $time [, int $now = time() ] )

例:

//昨天此刻的時間,明天則是 "1 days",前天則是"-2 days";
date("Y-m-d H:i:s", strtotime("-1 days")) 

//今天此刻的時間,等價於date("Y-m-d H:i:s")
date("Y-m-d H:i:s", strtotime("0 days")) 

//昨天此刻的時間,明天則是 "1 days",前天則是"-2 days";
date("Y-m-d H:i:s", strtotime("-1 days")) 

//今天此刻的時間,等價於date("Y-m-d H:i:s")
date("Y-m-d H:i:s", strtotime("0 days")) 

//獲取指定日期$date所在月的第一天和最後一天
$firstday = date("Y-m-01", strtotime($date));
$lastday = date("Y-m-d", strtotime("$firstday +1 month -1 day"));

//獲得指定日期$day所在星期的第一天和最後一天
$lastday = date('Y-m-d', strtotime("$day Sunday"));
$firstday = date('Y-m-d', strtotime("$lastday -6 days"));

3)mktime — 取得一個日期的 Unix 時間戳

int mktime ([ int $hour = date("H") [, int $minute = date("i") [, int $second = date("s") [, int $month = date("n") [, int $day = date("j") [, int $year = date("Y") [, int $is_dst = -1 ]]]]]]] )

根據給出的引數返回 Unix 時間戳。時間戳是一個長整數,包含了從 Unix 紀元(January 1 1970 00:00:00 GMT)到給定時間的秒數。

引數可以從右向左省略,任何省略的引數會被設定成本地日期和時間的當前值。

mktime()在做日期計算和驗證方面很有用,它會自動計算超出範圍的輸入的正確值。

例1,下面例子中每一行都會產生字串"Jan-01-1998":

echo date("M-d-Y", mktime(0, 0, 0, 12, 32, 1997));
echo date("M-d-Y", mktime(0, 0, 0, 13, 1, 1997));
echo date("M-d-Y", mktime(0, 0, 0, 1, 1, 1998));
echo date("M-d-Y", mktime(0, 0, 0, 1, 1, 98));

例2,計算下個月的最後一天:

任何給定月份的最後一天都可以被表示為下個月的第 “0” 天,而不是 -1 天。下面兩個例子都會產生字串 “The last day in Feb 2000 is: 29”

$lastday = mktime(0, 0, 0, 3, 0, 2000);
echo strftime("Last day in Feb 2000 is: %d", $lastday);
$lastday = mktime(0, 0, 0, 4, -31, 2000);
echo strftime("Last day in Feb 2000 is: %d", $lastday);

參考:

官方文件:

相關書籍:

  • 《PHP經典例項》 David Sklar & Adam Trachtenberg