概述
PHP中對日期進行處理常用的幾個函數如下:
- date(): 把時間戳格式化為更易讀的日期和時間
- time(): 獲取當前 Unix 時間戳
- strtotime(): 將表示時間和日期的字符串轉化為相應的時間戳
- mktime(): 創建日期
這些函數是PHP核心的部分,無需安裝即可使用。另外需要注意的是,這些函數的行為還受到 php.ini 中配置的時區等的影響。
名稱 | 描述 | 默認 | PHP 版本 |
---|---|---|---|
date.timezone | 默認時區(所有的 Date/Time 函數使用該選項) | "" | PHP 5.1 |
date.default_latitude | 默認緯度(date_sunrise() 和 date_sunset() 使用該選項) | "31.7667" | PHP 5.0 |
date.default_longitude | 默認經度(date_sunrise() 和 date_sunset() 使用該選項) | "35.2333" | PHP 5.0 |
date.sunrise_zenith | 默認日出天頂(date_sunrise() 和 date_sunset() 使用該選項) | "90.83" | PHP 5.0 |
date.sunset_zenith | 默認日落天頂(date_sunrise() 和 date_sunset() 使用該選項) | "90.83" | PHP 5.0 |
date() 函數詳細介紹
data() 函數的語法如下:
string date ( string $format [, int $timestamp ] )
- format : 必需,規定輸出日期字符串的格式
- timestamp : 可選,規定整數的 Unix 時間戳。默認是當前的本地時間 time()
- 返回值是格式化后的時間字符串
<?php
// 假定今天是:March 10th, 2001, 5:16:18 pm
$today = date("Y-m-d H:i:s"); // 2001-03-10 17:16:18 (MySQL DATETIME 格式)
$today = date("F j, Y, g:i a"); // March 10, 2001, 5:16 pm
$today = date("m.d.y"); // 03.10.01
$today = date("j, n, Y"); // 10, 3, 2001
$today = date("Ymd"); // 20010310
$today = date('h-i-s, j-m-y, it is w Day z '); // 05-16-17, 10-03-01, 1631 1618 6 Fripm01
$today = date('\i\t \i\s \t\h\e jS \d\a\y.'); // It is the 10th day.
$today = date("D M j G:i:s T Y"); // Sat Mar 10 15:16:08 MST 2001
$today = date('H:m:s \m \i\s\ \m\o\n\t\h'); // 17:03:17 m is month
$today = date("H:i:s"); // 17:16:17
date('Y'); // 當前年份
date('m'); // 當前月份
date('d'); // 當前是幾號
strtotime() 函數詳細介紹
strtotime() 函數語法如下:
int strtotime ( string $time [, int $now = time() ] )
- time : 日期/時間字符串
- now : 用來計算返回值的時間戳
- 本函數預期接受一個包含美國英語日期格式的字符串並嘗試將其解析為 Unix 時間戳,其值相對於 now 參數給出的時間,如果沒有提供此參數則用系統當前時間
- 成功則返回時間戳,否則返回 FALSE,在 PHP 5.1.0 之前本函數在失敗時返回 -1
<?php
echo strtotime("now"), "\n"; // 現在時間戳
echo strtotime("10 September 2000"), "\n"; // 2000年10月現在時間戳
echo strtotime("+1 day"), "\n"; // 距離現在一天后的時間戳
echo strtotime("-3 day"), "\n"; // 距離現在三天前的時間戳
echo strtotime("+1 week"), "\n"; // 距離現在一周后的時間戳
echo strtotime("-1 month"), "\n";// 距離現在一個月前的時間戳
echo strtotime("+1 year"), "\n"; // 距離現在一年后的時間戳
echo strtotime("+1 week 2 days 4 hours 2 seconds"), "\n"; // 距離現在1周2天4小時2秒后的時間戳
echo strtotime("next Thursday"), "\n"; // 下個星期三
echo strtotime("last Monday"), "\n"; // 本月的最后一個星期一
mktime() 函數詳細介紹
mktime() 函數語法如下:
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 ]]]]]]] )
- 參數可以從右向左省略,任何省略的參數會被設置成本地日期和時間的當前值
- hour : 小時數
- minute : 分鍾數
- second : 秒數(一分鍾之內)
- month : 月份數
- day : 天數
- year : 年份數
- is_dst : 本參數可以設為 1,表示正處於夏時制時間(DST),0 表示不是夏時制,或者 -1(默認值)表示不知道是否是夏時制
- 任何給定月份的最后一天都可以被表示為下個月的第 "0" 天,而不是 -1 天
- 如果參數非法,本函數返回 FALSE (在 PHP 5.1 之前返回 -1)
<?php
$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);
?>
其他一些常用函數
time() 獲取當前Unix秒數時間戳,還可以使用 microtime() 獲取當前 Unix 時間戳和微秒數,這個函數經常用來計算腳本運行的耗時
mixed microtime ([ bool $get_as_float ] )
- 如果調用時不帶可選參數,本函數以 "msec sec" 的格式返回一個字符串,其中 sec 是自 Unix 紀元(0:00:00 January 1, 1970 GMT)起到現在的秒數,msec 是微秒部分。字符串的兩部分都是以秒為單位返回的。
- 如果給出了 get_as_float 參數並且其值等價於 TRUE,microtime() 將返回一個浮點數
- get_as_float 參數是 PHP 5.0.0 新加的
<?php
/**
* 兼容php5.0版本以下
*/
function microtime_float()
{
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
$time_start = microtime_float();
usleep(100); // 睡一小會兒
$time_end = microtime_float();
$time = $time_end - $time_start;
echo "耗時: $time 秒\n";
?>
時間戳和時間字符串
基本函數使用說明
使用 time() 函數,會獲取當前時間的 Unix 時間戳,是一個10位的整數,表示自 Unix 紀元(1月1日 1970 00:00:00 GMT)起的當前時間的秒數。
使用 strtotime() 函數,可以將任何英文文本的日期或時間描述解析為 Unix 時間戳。失敗則返回 FALSE。應該盡可能使用 YYYY-MM-DD 格式或者使用 date_create_from_format() 函數
使用 date() 函數,可以將時間戳按照指定的格式格式化為時間字符串
基本示例
$time = time(); // 當前時間戳
var_dump($time); // int(1516155874)
$time_str = date('Y-m-d H:i:s', $time); // 將時間戳轉化為相應的時間字符串
var_dump($time_str); // string(19) "2018-01-17 02:24:34"
$time_int = strtotime($time_str); // 將時間字符串轉化為時間戳
var_dump($time_int); // int(1516155874)
常用時間獲取
獲取那種基於某個時間一定時間段的時間的做法,可以使用 strtotime(),也可以 time() 獲取當前時間然后加上或減去指定時間距離現在的偏移秒數。
- 獲取前一天的時間戳:strtotime('-1 day') 或者 time() - 3600 * 24
- 獲取今天凌晨0點的時間戳:strtotime(date("Y-m-d"), time())
- 獲取今天某個時刻如6點半的時間戳: strtotime(data('Y-m-d')) + 6 * 3600 + 30 * 60
數據庫查詢注意事項
在數據庫中保存為 timastamp 或者 datetime 類型的數據,在PHP中查詢時,需要使用時間字符串進行查詢,而且查詢結果也是時間字符串。
另外如果是使用 int 類型保存的時間戳,則要使用時間戳進行查詢。查詢結果是時間戳。